Disclaimer: The purpose of the Open Case Studies project is to demonstrate the use of various data science methods, tools, and software in the context of messy, real-world data. A given case study does not cover all aspects of the research process, is not claiming to be the most appropriate way to analyze a given data set, and should not be used in the context of making policy decisions without external consultation from scientific experts.

This work is licensed under the Creative Commons Attribution-NonCommercial 3.0 (CC BY-NC 3.0) United States License.

Motivation


This case study will introduce the topic of multicolinearity. We will do so by showcasing a real world example where multicolinearity in part resulted in historically contriversial and conflicting findings about the influence of the adoption of right-to-carry (RTC) concealed handgun laws on violent crime rates in the United States.

We will focus on two articles:

  1. The first analysis by Lott and Mustard published in 1996 suggests that RTC laws reduce violent crime. Lott authored a book extending these findings in 1998 called More Guns, Less Crime.

  1. The second analysis is a recent article by Donohue, et al. published in 2017 that suggests that RTC laws increase violent crime. Donohue has also published previous articles with titles such as “Shooting down the”More Guns, Less Crime" Hypothesis

This has been a controversial topic as many other articles also had conflicting results. See here for a list of studies.

The Donohue, et al. article discusses how there are many other important methodolical aspects besides multicolinearity that could account for the historically conflicting results in these previous papers.

In fact, nearly every aspect of the data analysis process was different between the Donohue, et al. analysis and the Lott and Mustard analysis.

However, we will focus particularly on multicolinearity and we will explore how it can influence linear regression analyses and result in different conclusions.

This analysis will demonstrate how methodological details can be critically influential for our overall conclusions and can result in important policy related consequences. This article will provide a basis for the motivation.

John J. Donohue et al., Right‐to‐Carry Laws and Violent Crime: A Comprehensive Assessment Using Panel Data and a State‐Level Synthetic Control Analysis. Journal of Empirical Legal Studies, 16,2 (2019).

David B. Mustard & John Lott. Crime, Deterrence, and Right-to-Carry Concealed Handguns. Coase-Sandor Institute for Law & Economics Working Paper No. 41, (1996).

Here you can see the differences in the data used in the featured RTC articles:

We will perform analyses similar to those in these articles, however we will not try to recreate them, instead we will simplify our analysis to allow us to focus on multicolinearity.

Therefore we will use a subset of the listed explanatory variables and they will be consistent for both analyses that we will perform, with the exception that one analysis will have 6 demographic variables like the analysis in the Donohue, et al. article and the other will have 36 demogrpahic variables like the analysis in the Lott and Mustard article.

Main Question


Our main question:

  1. How does the inclusion of different numbers of age groups influence the results of an analysis of right to carry laws and violence rates?

Learning Objectives


Statistical Learning Objectives:

In this case study, students will learn:
1) what multicolinearity is and how it can influence linear regression coefficients
2) how to look for the presence of multicolinarity
3) the difference between multicolinearity and correlation

Data science Learning Objectives:

  1. joining data from multiple sources (dplyr)
  2. reshaping data into different formats (tidyr)
  3. visualizations (ggplot2)

We will especially focus on using packages and functions from the Tidyverse, such as dplyr and ggplot2. The tidyverse is a library of packages created by RStudio. While some students may be familiar with previous R programming packages, these packages make data science in R especially efficient.

Context


So what exactly is a right-to-carry law?

It is a law thatspecifies if and how citizens are allowed to have a firearm on their person or nearby (for example in the citizen’s car) in public.

The Second Amendment to the United States Constitution guarantees the right to “keep and bear arms”. The amendment was ratified in 1791 as part of the Bill of Rights.

However, there are no federal laws about carrying firearms in public.

These laws are created and enforced at the state level. Sates vary greatly in their laws about the right to carry firearms. Some require extensive effort to obtain a permit to legally carry a firearm, while other states require very minimal effort to legally carry a firearm.

According to Wikipedia about the history of right-to-carry policies in the United States:

Public perception on concealed carry vs open carry has largely flipped. In the early days of the United States, open carrying of firearms, long guns and revolvers was a common and well-accepted practice. Seeing guns carried openly was not considered to be any cause for alarm. Therefore, anyone who would carry a firearm but attempt to conceal it was considered to have something to hide, and presumed to be a criminal. For this reason, concealed carry was denounced as a detestable practice in the early days of the United States.

Concealed weapons bans were passed in Kentucky and Louisiana in 1813. (In those days open carry of weapons for self-defense was considered acceptable; concealed carry was denounced as the practice of criminals.) By 1859, Indiana, Tennessee, Virginia, Alabama, and Ohio had followed suit. By the end of the nineteenth century, similar laws were passed in places such as Texas, Florida, and Oklahoma, which protected some gun rights in their state constitutions. Before the mid 1900s, most U.S. states had passed concealed carry laws rather than banning weapons completely. Until the late 1990s, many Southern states were either “No-Issue” or “Restrictive May-Issue”. Since then, these states have largely enacted “Shall-Issue” licensing laws, with numerous states legalizing “Unrestricted concealed carry”.

See here for more information.

Here are the general categories of Right to Carry Laws:

source

source

You can see that none of the fifty states have no-issue laws currently, meaning that all states allow the right to carry firearms at least in some way, however the level of restrictions is dramatically different from one state to another.

Here you can see how these laws have changed over time around the country:

There is variation from state to state even within the same general category:

For example here are the current carry laws in Idaho which is considered an “Unrestricted - no permit required” state:

Idaho permits the open carrying of firearms.

Idaho law permits both residents and non-residents who are at least 18 years old to carry concealed weapons, without a carry license, outside the limits of or confines of any city, provided the person is not otherwise disqualified from being issued a license to carry.

A person may also carry concealed weapons on or about his or her person, without a license, in the person’s own place of abode or fixed place of business, on property in which the person has any ownership or leasehold interest, or on private property where the person has permission to carry from any person who has an ownership or leasehold interest in that property.

State law also allows any resident of Idaho or a current member of the armed forces of the United States to carry a concealed handgun without a license to carry, provided the person is over 18 years old and not disqualified from being issued a license to carry concealed weapons under state law. An amendment to state law that takes effect on July 1, 2020 changes the reference in the above law from “a resident of Idaho” to “any citizen of the United States.”

And here are the current carry laws in Arizona which is also considered an “Unrestricted- - no permit required” state:

Arizona respects the right of law abiding citizens to openly carry a handgun.

Any person 21 years of age or older, who is not prohibited possessor, may carry a weapon openly or concealed without the need for a license. Any person carrying without a license must acknowledge and comply with the demands of a law enforcement officer when asked if he/she is carrying a concealed deadly weapon, if the officer has initiated an “investigation” such as a traffic stop.

Notice that citizens in Idaho only need to be 18 to carry a firearm, whereas they must be 21 in Arizona.

In contrast here is an example of current carry laws in Maryland which is considered a “Rights Restricted-Very Limited Issue” state:

Carrying and Transportation in Vehicles It is unlawful for any person without a permit to wear or carry a handgun, openly or concealed, upon or about his person. It is also unlawful for any person to knowingly transport a handgun in any vehicle traveling on public roads, highways, waterways or airways, or upon roads or parking lots generally used by the public. This does not apply to any person wearing, carrying or transporting a handgun within the confines of real estate owned or leased by him, or on which he resides, or within the confines of a business establishment owned or leased by him.

Permit To Carry Application for a permit to carry a handgun is made to the Secretary of State Police. In addition to the printed application form, the applicant should submit a notarized letter stating the reasons why he is applying for a permit.

avocado….Right to carry and covid masks?

Limitations


There are some important considerations regarding this data analysis to keep in mind:

  1. We do not use all of the data used by either the Lott and Mustard or Donohue, et al. analyses, nor do we perform the same analysis of each article. We instead perform a much simpler analysis with less variables for the purposes of illustration of the concept of multicollinearity and its influence on regression coefficients, not to reproduce either analysis.

  2. Because our analysis is an oversimplification, our analysis should not be used for determining policy changes, instead we suggest that users consult with a specialist.

We would also like to note that…AVOCADO It is important that we do not treat race as an objective measure. Despite this, it can be used to advance scientific inquiry. For more information on this topic, we have included a link to a paper on the use of race as a measure in epidemiology.

We will begin by loading the packages that we will need:

Package Use
here to easily load and save data
readr to import the CSV file data
[car] to calculate vif values

The first time we use a function, we will use the :: to indicate which package we are using. Unless we have overlapping function names, this is not necessary, but we will include it here to be informative about where the functions we will use come from.

What are the data?


Below is a table from the Donohue, et al. paper that shows the data used in both analyses, where DAW stands for Donohue, et al. and LM stands for Lott and Mustard.

We will be using a subset of these variables, which are highlighted in green:

Data Import


##State FIPS codes Avocado why do we need State FIPS?

The following data was downloaded from the US Census Bureau.

To import the data we will use the read_xls() function of the readxl package. Since the first five lines of this excel is information about the source of the data and when it was released, we need to skip importing these lines using the skip argument so that the data has the same number of columns for each row.

Demographic and Population data

To obtain information about age, sex, and race, and overall population we will use US Census Bureau data, just like both of the articles. The cesnus data is available for different time spans. Here are the links for the years used in our analysis. We will use data from 1977 to 2010.

Data Link
years 1977 to 1979 link
years 1980 to 1989 link * county data was used for this decade
years 1990 to 1999 link
years 2000 to 2010 link
technical documentation

To import the data we will use the read_csv() function of the readr package for the csv files. In some decades, there are separate files for each year, we will read each of these together using the base list.files() function to get all of the names for each file and then the map() function of the purrr package to apply the read_csv() function on all of the file paths in the list created by list.files(). For years that are txt files we will use read_table2() also fo the readr package. The read_table2() function, unlike the read_table(), allows for any number of whitespace characters between columns, and the lines can be of different lengths.

AVOCADO I am a bit confused about the last decade… it’s only one file but it seems to need map…

Police staffing data

The following data was downloaded from the Federal Bureau of Investigation.

The read_csv() function of the readr package guesses what the class is for each variable, but sometimes it makes mistakes. It is good to specify the class for variables if you know them. We know that we want the variables about male and female counts to be numberic. We can specify that using the col_types = argument. See here and here for more information. One

Data Wrangling


State FIPS codes

# A tibble: 6 x 4
  Region Division `State\n(FIPS)` Name                
  <chr>  <chr>    <chr>           <chr>               
1 1      0        00              Northeast Region    
2 1      1        00              New England Division
3 1      1        09              Connecticut         
4 1      1        23              Maine               
5 1      1        25              Massachusetts       
6 1      1        33              New Hampshire       
[1] "character"

Demographics

1977-1979

# A tibble: 6 x 22
  `Year of Estima… `FIPS State Cod… `State Name` `Race/Sex Indic…
             <dbl> <chr>            <chr>        <chr>           
1             1970 01               Alabama      White male      
2             1970 01               Alabama      White female    
3             1970 01               Alabama      Black male      
4             1970 01               Alabama      Black female    
5             1970 01               Alabama      Other races male
6             1970 01               Alabama      Other races fem…
# … with 18 more variables: `Under 5 years` <dbl>, `5 to 9 years` <dbl>, `10 to
#   14 years` <dbl>, `15 to 19 years` <dbl>, `20 to 24 years` <dbl>, `25 to 29
#   years` <dbl>, `30 to 34 years` <dbl>, `35 to 39 years` <dbl>, `40 to 44
#   years` <dbl>, `45 to 49 years` <dbl>, `50 to 54 years` <dbl>, `55 to 59
#   years` <dbl>, `60 to 64 years` <dbl>, `65 to 69 years` <dbl>, `70 to 74
#   years` <dbl>, `75 to 79 years` <dbl>, `80 to 84 years` <dbl>, `85 years and
#   over` <dbl>
 [1] "Year of Estimate"   "FIPS State Code"    "State Name"        
 [4] "Race/Sex Indicator" "Under 5 years"      "5 to 9 years"      
 [7] "10 to 14 years"     "15 to 19 years"     "20 to 24 years"    
[10] "25 to 29 years"     "30 to 34 years"     "35 to 39 years"    
[13] "40 to 44 years"     "45 to 49 years"     "50 to 54 years"    
[16] "55 to 59 years"     "60 to 64 years"     "65 to 69 years"    
[19] "70 to 74 years"     "75 to 79 years"     "80 to 84 years"    
[22] "85 years and over" 
[1] "numeric"
[1] "YEAR"      "STATE"     "RACE"      "SEX"       "AGE_GROUP" "SUB_POP"  
[1] "YEAR"    "STATE"   "TOT_POP"

1980-1989

           Year of Estimate FIPS State and County Codes 
                  "numeric"                 "character" 
         Race/Sex Indicator               Under 5 years 
                "character"                   "numeric" 
               5 to 9 years              10 to 14 years 
                  "numeric"                   "numeric" 
             15 to 19 years              20 to 24 years 
                  "numeric"                   "numeric" 
             25 to 29 years              30 to 34 years 
                  "numeric"                   "numeric" 
             35 to 39 years              40 to 44 years 
                  "numeric"                   "numeric" 
             45 to 49 years              50 to 54 years 
                  "numeric"                   "numeric" 
             55 to 59 years              60 to 64 years 
                  "numeric"                   "numeric" 
             65 to 69 years              70 to 74 years 
                  "numeric"                   "numeric" 
             75 to 79 years              80 to 84 years 
                  "numeric"                   "numeric" 
          85 years and over 
                  "numeric" 
 [1] "Year of Estimate"            "FIPS State and County Codes"
 [3] "Under 5 years"               "5 to 9 years"               
 [5] "10 to 14 years"              "15 to 19 years"             
 [7] "20 to 24 years"              "25 to 29 years"             
 [9] "30 to 34 years"              "35 to 39 years"             
[11] "40 to 44 years"              "45 to 49 years"             
[13] "50 to 54 years"              "55 to 59 years"             
[15] "60 to 64 years"              "65 to 69 years"             
[17] "70 to 74 years"              "75 to 79 years"             
[19] "80 to 84 years"              "85 years and over"          
[21] "RACE"                        "SEX"                        
[1] "YEAR"      "STATE"     "AGE_GROUP" "SEX"       "RACE"      "SUB_POP"  
[1] "YEAR"    "STATE"   "TOT_POP"

1990-1999

 [1] "Year"     "e"        "Age"      "Male"     "Female"   "Male_1"  
 [7] "Female_1" "Male_2"   "Female_2" "Male_3"   "Female_3" "Male_4"  
[13] "Female_4" "Male_5"   "Female_5" "Male_6"   "Female_6" "Male_7"  
[19] "Female_7"
# A tibble: 6 x 19
   Year e       Age  Male Female Male_1 Female_1 Male_2 Female_2 Male_3 Female_3
  <dbl> <chr> <dbl> <dbl>  <dbl>  <dbl>    <dbl>  <dbl>    <dbl>  <dbl>    <dbl>
1    NA <NA>     NA    NA     NA     NA       NA     NA       NA     NA       NA
2  1990 01        0 20406  19101   9794     9414    103       90    192      170
3  1990 01        1 19393  18114   9475     9247     87       93    146      182
4  1990 01        2 18990  18043   9097     8837     97      100    175      160
5  1990 01        3 19246  17786   9002     8701     94      115    150      157
6  1990 01        4 19502  18366   9076     8989    108      114    168      178
# … with 8 more variables: Male_4 <dbl>, Female_4 <dbl>, Male_5 <dbl>,
#   Female_5 <dbl>, Male_6 <dbl>, Female_6 <dbl>, Male_7 <dbl>, Female_7 <dbl>
[1] 43870    19
# A tibble: 2 x 2
   n_na     n
  <dbl> <int>
1     0 43860
2    19    10
       YEAR     STATEFP         Age         W_M         W_F         B_M 
  "numeric" "character"   "numeric"   "numeric"   "numeric"   "numeric" 
        B_F      AIAN_M      AIAN_F       API_M       API_F 
  "numeric"   "numeric"   "numeric"   "numeric"   "numeric" 
   10 to 14 years    15 to 19 years    20 to 24 years    25 to 29 years 
             3060              3060              3060              3060 
   30 to 34 years    35 to 39 years    40 to 44 years    45 to 49 years 
             3060              3060              3060              3060 
     5 to 9 years    50 to 54 years    55 to 59 years    60 to 64 years 
             3060              3060              3060              3060 
   65 to 69 years    70 to 74 years    75 to 79 years    80 to 84 years 
             3060              3060              3060              3060 
85 years and over     Under 5 years 
             3060              3060 
       YEAR     STATEFP         W_M         W_F         B_M         B_F 
  "numeric" "character"   "numeric"   "numeric"   "numeric"   "numeric" 
     AIAN_M      AIAN_F       API_M       API_F   AGE_GROUP 
  "numeric"   "numeric"   "numeric"   "numeric" "character" 

2000-2010

           REGION          DIVISION             STATE              NAME 
        "numeric"         "numeric"         "numeric"       "character" 
              SEX            ORIGIN              RACE            AGEGRP 
        "numeric"         "numeric"         "numeric"         "numeric" 
ESTIMATESBASE2000   POPESTIMATE2000   POPESTIMATE2001   POPESTIMATE2002 
        "numeric"         "numeric"         "numeric"         "numeric" 
  POPESTIMATE2003   POPESTIMATE2004   POPESTIMATE2005   POPESTIMATE2006 
        "numeric"         "numeric"         "numeric"         "numeric" 
  POPESTIMATE2007   POPESTIMATE2008   POPESTIMATE2009     CENSUS2010POP 
        "numeric"         "numeric"         "numeric"         "numeric" 
  POPESTIMATE2010 
        "numeric" 
 [1] "STATE"           "SEX"             "RACE"            "AGE_GROUP"      
 [5] "POPESTIMATE2000" "POPESTIMATE2001" "POPESTIMATE2002" "POPESTIMATE2003"
 [9] "POPESTIMATE2004" "POPESTIMATE2005" "POPESTIMATE2006" "POPESTIMATE2007"
[13] "POPESTIMATE2008" "POPESTIMATE2009" "POPESTIMATE2010"
      STATE         SEX        RACE   AGE_GROUP        YEAR     SUB_POP 
"character" "character" "character" "character"   "numeric"   "numeric" 
# A tibble: 1 x 2
  poss_error     n
  <lgl>      <int>
1 FALSE        561

1977 - 2010

[1] TRUE
[1] TRUE
[1] TRUE
# A tibble: 6 x 6
   YEAR STATE   RACE  SEX   AGE_GROUP      PERC_SUB_POP
  <dbl> <chr>   <chr> <chr> <chr>                 <dbl>
1  1977 Alabama White Male  Under 5 years          2.61
2  1977 Alabama White Male  5 to 9 years           3.00
3  1977 Alabama White Male  10 to 14 years         3.25
4  1977 Alabama White Male  15 to 19 years         3.58
5  1977 Alabama White Male  20 to 24 years         3.33
6  1977 Alabama White Male  25 to 29 years         2.95
# A tibble: 6 x 6
   YEAR STATE   AGE_GROUP      SEX    RACE  PERC_SUB_POP
  <dbl> <chr>   <chr>          <chr>  <chr>        <dbl>
1  1980 Alabama 10 to 14 years Female Black       1.28  
2  1980 Alabama 10 to 14 years Female Other       0.0206
3  1980 Alabama 10 to 14 years Female White       2.80  
4  1980 Alabama 10 to 14 years Male   Black       1.30  
5  1980 Alabama 10 to 14 years Male   Other       0.0212
6  1980 Alabama 10 to 14 years Male   White       2.97  
# A tibble: 6 x 6
   YEAR AGE_GROUP      RACE  SEX    STATE   PERC_SUB_POP
  <dbl> <chr>          <chr> <chr>  <chr>          <dbl>
1  1990 10 to 14 years White Male   Alabama       2.46  
2  1990 10 to 14 years White Female Alabama       2.33  
3  1990 10 to 14 years Black Male   Alabama       1.21  
4  1990 10 to 14 years Black Female Alabama       1.20  
5  1990 10 to 14 years Other Male   Alabama       0.0239
6  1990 10 to 14 years Other Female Alabama       0.0235
# A tibble: 6 x 6
  STATE   SEX   RACE  AGE_GROUP      YEAR PERC_SUB_POP
  <chr>   <chr> <chr> <chr>         <dbl>        <dbl>
1 Alabama Male  White Under 5 years  2000         2.24
2 Alabama Male  White Under 5 years  2001         2.24
3 Alabama Male  White Under 5 years  2002         2.22
4 Alabama Male  White Under 5 years  2003         2.21
5 Alabama Male  White Under 5 years  2004         2.20
6 Alabama Male  White Under 5 years  2005         2.20
[1] 18
[1] 18
[1] 18
[1] 18
# A tibble: 1 x 1
  years_data
       <int>
1         34
[1] 34
DONOHUE_AGE_GROUPS <- c("15 to 19 years",
                        "20 to 24 years",
                        "25 to 29 years",
                        "30 to 34 years",
                        "35 to 39 years")

DONOHUE_RACE <- c("White",
                  "Black",
                  "Other")

DONOHUE_SEX <- c("Male")

dem_DONOHUE <- dem %>%
  filter(AGE_GROUP %in% DONOHUE_AGE_GROUPS,
         RACE %in% DONOHUE_RACE,
         SEX %in% DONOHUE_SEX) %>%
  mutate(AGE_GROUP = fct_collapse(AGE_GROUP, "20 to 39 years"=c("20 to 24 years",
                                                                "25 to 29 years",
                                                                "30 to 34 years",
                                                                "35 to 39 years"))) %>%
  mutate(AGE_GROUP = str_replace_all(AGE_GROUP," ","_")) %>%
  group_by(YEAR, STATE, RACE, SEX, AGE_GROUP) %>%
  summarise(PERC_SUB_POP = sum(PERC_SUB_POP), .groups = "drop") %>%
  unite(col = "VARIABLE", RACE, SEX, AGE_GROUP, sep = "_") %>%
  rename("VALUE"=PERC_SUB_POP)

LOTT_AGE_GROUPS_NULL <- c("Under 5 years",
                          "5 to 9 years")

LOTT_RACE <- c("White",
               "Black",
               "Other")

LOTT_SEX <- c("Male",
              "Female")

dem_LOTT <- dem %>%
  filter(!(AGE_GROUP %in% LOTT_AGE_GROUPS_NULL),
         RACE %in% LOTT_RACE,
         SEX %in% LOTT_SEX) %>%
  mutate(AGE_GROUP = fct_collapse(AGE_GROUP,
                                  "10 to 19 years"=c("10 to 14 years",
                                                     "15 to 19 years"),
                                  "20 to 29 years"=c("20 to 24 years",
                                                     "25 to 29 years"),
                                  "30 to 39 years"=c("30 to 34 years",
                                                     "35 to 39 years"),
                                  "40 to 49 years"=c("40 to 44 years",
                                                     "45 to 49 years"),
                                  "50 to 64 years"=c("50 to 54 years",
                                                     "55 to 59 years",
                                                     "60 to 64 years"),
                                  "65 years and over"=c("65 to 69 years",
                                                        "70 to 74 years",
                                                        "75 to 79 years",
                                                        "80 to 84 years",
                                                        "85 years and over"))) %>%
  mutate(AGE_GROUP = str_replace_all(AGE_GROUP," ","_")) %>%
  group_by(YEAR, STATE, RACE, SEX, AGE_GROUP) %>%
  summarise(PERC_SUB_POP = sum(PERC_SUB_POP), .groups = "drop") %>%
  unite(col = "VARIABLE", RACE, SEX, AGE_GROUP, sep = "_") %>%
  rename("VALUE"=PERC_SUB_POP)
  
dim(expand.grid(c(1:6), c(7:8), c(9:10)))[1]
[1] 24
[1] TRUE
[1] TRUE
[1] TRUE
# A tibble: 6 x 3
   YEAR STATE       TOT_POP
  <dbl> <chr>         <dbl>
1  1977 Alabama     3782571
2  1977 Alaska       397220
3  1977 Arizona     2427296
4  1977 Arkansas    2207195
5  1977 California 22350332
6  1977 Colorado    2696179
# A tibble: 6 x 3
   YEAR STATE       TOT_POP
  <dbl> <chr>         <dbl>
1  1980 Alabama     3899671
2  1980 Alaska       404680
3  1980 Arizona     2735840
4  1980 Arkansas    2288809
5  1980 California 23792840
6  1980 Colorado    2909545
# A tibble: 6 x 3
   YEAR STATE       TOT_POP
  <dbl> <chr>         <dbl>
1  1990 Alabama     4048508
2  1990 Alaska       553120
3  1990 Arizona     3679056
4  1990 Arkansas    2354343
5  1990 California 29950111
6  1990 Colorado    3303862
# A tibble: 6 x 3
   YEAR STATE       TOT_POP
  <dbl> <chr>         <dbl>
1  2000 Alabama     4452173
2  2000 Alaska       627963
3  2000 Arizona     5160586
4  2000 Arkansas    2678588
5  2000 California 33987977
6  2000 Colorado    4326921
# A tibble: 34 x 2
    YEAR     n
   <dbl> <int>
 1  1977    51
 2  1978    51
 3  1979    51
 4  1980    51
 5  1981    51
 6  1982    51
 7  1983    51
 8  1984    51
 9  1985    51
10  1986    51
11  1987    51
12  1988    51
13  1989    51
14  1990    51
15  1991    51
16  1992    51
17  1993    51
18  1994    51
19  1995    51
20  1996    51
21  1997    51
22  1998    51
23  1999    51
24  2000    51
25  2001    51
26  2002    51
27  2003    51
28  2004    51
29  2005    51
30  2006    51
31  2007    51
32  2008    51
33  2009    51
34  2010    51

Police staffing

 [1] "data_year"             "ori"                   "pub_agency_name"      
 [4] "pub_agency_unit"       "state_abbr"            "division_name"        
 [7] "region_name"           "county_name"           "agency_type_name"     
[10] "population_group_desc" "population"            "male_officer_ct"      
[13] "male_civilian_ct"      "male_total_ct"         "female_officer_ct"    
[16] "female_civilian_ct"    "female_total_ct"       "officer_ct"           
[19] "civilian_ct"           "total_pe_ct"           "pe_ct_per_1000"       
# A tibble: 59 x 2
   state_abbr     n
   <chr>      <int>
 1 AK            38
 2 AL            38
 3 AR            38
 4 AS            38
 5 AZ            38
 6 CA            38
 7 CO            38
 8 CT            38
 9 CZ            38
10 DC            38
11 DE            38
12 FL            38
13 FS            38
14 GA            38
15 GM            38
16 HI            38
17 IA            38
18 ID            38
19 IL            38
20 IN            38
21 KS            38
22 KY            38
23 LA            38
24 MA            38
25 MD            38
26 ME            38
27 MI            38
28 MN            38
29 MO            38
30 MP            38
31 MS            38
32 MT            38
33 NB            38
34 NC            38
35 ND            38
36 NH            38
37 NJ            38
38 NM            38
39 NV            38
40 NY            38
41 OH            38
42 OK            38
43 OR            38
44 OT            38
45 PA            38
46 PR            38
47 RI            38
48 SC            38
49 SD            38
50 TN            38
51 TX            38
52 UT            38
53 VA            38
54 VI            38
55 VT            38
56 WA            38
57 WI            38
58 WV            38
59 WY            38
   state_abbr          STATE
1          AL        Alabama
2          AK         Alaska
3          AZ        Arizona
4          AR       Arkansas
5          CA     California
6          CO       Colorado
7          CT    Connecticut
8          DE       Delaware
9          FL        Florida
10         GA        Georgia
11         HI         Hawaii
12         ID          Idaho
13         IL       Illinois
14         IN        Indiana
15         IA           Iowa
16         KS         Kansas
17         KY       Kentucky
18         LA      Louisiana
19         ME          Maine
20         MD       Maryland
21         MA  Massachusetts
22         MI       Michigan
23         MN      Minnesota
24         MS    Mississippi
25         MO       Missouri
26         MT        Montana
27         NE       Nebraska
28         NV         Nevada
29         NH  New Hampshire
30         NJ     New Jersey
31         NM     New Mexico
32         NY       New York
33         NC North Carolina
34         ND   North Dakota
35         OH           Ohio
36         OK       Oklahoma
37         OR         Oregon
38         PA   Pennsylvania
39         RI   Rhode Island
40         SC South Carolina
41         SD   South Dakota
42         TN      Tennessee
43         TX          Texas
44         UT           Utah
45         VT        Vermont
46         VA       Virginia
47         WA     Washington
48         WV  West Virginia
49         WI      Wisconsin
50         WY        Wyoming

Unemployment

# A tibble: 1 x 14
   Year   Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1  2020   3.2   2.9     3  13.3    NA    NA    NA    NA    NA    NA    NA    NA
# … with 1 more variable: Annual <dbl>
 [1] "STATE"  "Year"   "Jan"    "Feb"    "Mar"    "Apr"    "May"    "Jun"   
 [9] "Jul"    "Aug"    "Sep"    "Oct"    "Nov"    "Dec"    "Annual"
      STATE        Year         Jan         Feb         Mar         Apr 
"character"   "numeric"   "numeric"   "numeric"   "numeric"   "numeric" 
        May         Jun         Jul         Aug         Sep         Oct 
  "numeric"   "numeric"   "numeric"   "numeric"   "numeric"   "numeric" 
        Nov         Dec      Annual 
  "numeric"   "numeric"   "numeric" 

Poverty rate

# A tibble: 6 x 6
  `NOTE: Number in thousa… ...2  ...3   ...4         ...5         ...6          
  <chr>                    <chr> <chr>  <chr>        <chr>        <chr>         
1 2018                     <NA>  <NA>    <NA>        <NA>          <NA>         
2 STATE                    Total Number "Standard\n… Percent      "Standard\ner…
3 Alabama                  4877  779    "65"         16           "1.3"         
4 Alaska                   720   94     "9"          13.1         "1.2"         
5 Arizona                  7241  929    "80"         12.80000000… "1.1000000000…
6 Arkansas                 2912  462    "38"         15.9         "1.3"         
# A tibble: 6 x 6
  STATE                             Total Number Number_se Percent Percent_se   
  <chr>                             <chr> <chr>  <chr>     <chr>   <chr>        
1 Wisconsin                         4724  403    57        8.5     1.1000000000…
2 Wyoming                           468   49     20        10.4    4            
3 Standard errors shown in this ta… <NA>  <NA>   <NA>      <NA>    <NA>         
4 For information on confidentiali… <NA>  <NA>   <NA>      <NA>    <NA>         
5 Footnotes are available at <www.… <NA>  <NA>   <NA>      <NA>    <NA>         
6 SOURCE: U.S. Bureau of the Censu… <NA>  <NA>   <NA>      <NA>    <NA>         
[1] "2 extra groups"
# A tibble: 6 x 7
  STATE   Total Number Number_se      Percent        Percent_se       year_group
  <chr>   <chr> <chr>  <chr>          <chr>          <chr>                 <int>
1 2018    <NA>  <NA>    <NA>          <NA>            <NA>                     1
2 STATE   Total Number "Standard\ner… Percent        "Standard\nerro…          1
3 Alabama 4877  779    "65"           16             "1.3"                     1
4 Alaska  720   94     "9"            13.1           "1.2"                     1
5 Arizona 7241  929    "80"           12.8000000000… "1.100000000000…          1
6 Arkans… 2912  462    "38"           15.9           "1.3"                     1
# A tibble: 2 x 2
   n_na     n
  <dbl> <int>
1     0  1989
2     5    39
       YEAR       STATE       Total      Number   Number_se     Percent 
"character" "character" "character" "character" "character" "character" 
 Percent_se        n_na 
"character"   "numeric" 
[1] "YEAR"     "STATE"    "VALUE"    "VARIABLE"

Violent crime

https://www.ucrdatatool.gov/Search/Crime/State/StatebyState.cfm

[1] 2254
       YEAR          VC       STATE 
"character" "character" "character" 

RTC laws

 [1] 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109
[20] 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109
[39] 109 109 109 109 109 109 109 109 109 109 109 109 109 109  63
[1] "                                                             60"
 [1] 3 4 4 4 3 4 2 3 2 4 4 3 4 3 4 4 4 4 4 4 3 2 4 4 4 4 4 4 4 2 3 3 3 3 3 4 4 4
[39] 3 3 2 3 3 4 4 4 3 4 2 3 4 4
 [1] 2 3 3 3 2 3 2 2 2 3 3 2 3 2 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 2 2 3 2 3 3 3 3 3
[39] 3 3 2 3 3 3 3 3 2 3 2 3 3 3
 [1] 2 2 2 2 1 2 1 1 1 2 2 2 2 1 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2
[39] 2 2 1 2 2 2 2 2 2 2 1 2 2 2
 [1] 1 0 0 0 1 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0
[39] 0 0 1 0 0 0 0 0 1 0 1 0 0 0
                                                                                                              .
1       Alabama                    1975                                                                    1975
2        Alaska                 10/1/1994                          0.252                                   1995
3        Arizona                7/17/1994                          0.460                                   1995
4       Arkansas                7/27/1995                          0.433                                   1996
5      California                  N/A                                                                        0
6       Colorado                5/17/2003                          0.627                                   2003
  apply(p_62, 1, str_count, "\\\\s{40,}")
1                                       1
2                                       0
3                                       0
4                                       0
5                                       1
6                                       0
$`|Alabama||1975|N/A|1975`
[1] 0 7 4 3 4

$`|Alaska||10/1/1994||0.252|||1995`
[1] 0 6 9 5 4

$`|Arizona| 7/17/1994||0.460|||1995`
[1]  0  7 10  5  4

$`|Arkansas| 7/27/1995||0.433|||1996`
[1]  0  8 10  5  4

$`|California||N/A|N/A|0`
[1]  0 10  3  3  1

$`|Colorado| 5/17/2003||0.627|||2003`
[1]  0  8 10  5  4

$`|Connecticut||1970|N/A|1970`
[1]  0 11  4  3  4

$`|Delaware||N/A|N/A|0`
[1] 0 8 3 3 1

$`District of Columbia|N/A|N/A|0`
[1] 20  3  3  1

$`|Florida| 10/1/1987||0.252|||1988`
[1]  0  7 10  5  4

$`|Georgia| 8/25/1989||0.353|||1990`
[1]  0  7 10  5  4

$`|Hawaii||N/A|N/A|0`
[1] 0 6 3 3 1

$`|Idaho||7/1/1990||0.504|||1990`
[1] 0 5 8 5 4

$`|Illinois| 1/5/2014|N/A|2014`
[1] 0 8 9 3 4

$`|Indiana| 1/15/1980||0.962|||1980`
[1]  0  7 10  5  4

$`|Iowa||1/1/2011||1.000|||2011`
[1] 0 4 8 5 4

$`|Kansas||1/1/2007||1.000|||2007`
[1] 0 6 8 5 4

$`|Kentucky| 10/1/1996||0.251|||1997`
[1]  0  8 10  5  4

$`|Louisiana|4/19/1996||0.702|||1996`
[1] 0 9 9 5 4

$`|Maine||9/19/1985||0.285|||1986`
[1] 0 5 9 5 4

$`|Maryland||N/A|N/A|0`
[1] 0 8 3 3 1

$`|Massachusetts||N/A|N/A|0`
[1]  0 13  3  3  1

$`|Michigan||7/1/2001||0.504|||2001`
[1] 0 8 8 5 4

$`|Minnesota| 5/28/2003||0.597|||2003`
[1]  0  9 10  5  4

$`|Mississippi|7/1/1990||0.504|||1990`
[1]  0 11  8  5  4

$`|Missouri| 2/26/2004||0.847|||2004`
[1]  0  8 10  5  4

$`|Montana||10/1/1991||0.252|||1992`
[1] 0 7 9 5 4

$`|Nebraska||1/1/2007||1.000|||2007`
[1] 0 8 8 5 4

$`|Nevada||10/1/1995||0.252|||1996`
[1] 0 6 9 5 4

$`|New Hampshire||1959|N/A|1959`
[1]  0 13  4  3  4

$`|New Jersey||N/A|N/A|0`
[1]  0 10  3  3  1

$`|New Mexico||1/1/2004||1.000|||2004`
[1]  0 10  8  5  4

$`|New York||N/A|N/A|0`
[1] 0 8 3 3 1

$`|North Carolina|12/1/1995||0.085|||1996`
[1]  0 14  9  5  4

$`|North Dakota| 8/1/1985||0.419|||1986`
[1]  0 12  9  5  4

$`|Ohio||4/8/2004||0.732|||2004`
[1] 0 4 8 5 4

$`|Oklahoma||1/1/1996||1.000|||1996`
[1] 0 8 8 5 4

$`|Oregon||1/1/1990||1.000|||1990`
[1] 0 6 8 5 4

$`|Pennsylvania|6/17/1989||0.542|||1989`
[1]  0 12  9  5  4

$`|Philadelphia|10/11/1995||0.225|||1996`
[1]  0 12 10  5  4

$`|Rhode Island||N/A|N/A|0`
[1]  0 12  3  3  1

$`|South Carolina|8/23/1996||0.358|||1997`
[1]  0 14  9  5  4

$`|South Dakota| 7/1/1985||0.504|||1985`
[1]  0 12  9  5  4

$`|Tennessee| 10/1/1996||0.251|||1997`
[1]  0  9 10  5  4

$`|Texas||1/1/1996||1.000|||1996`
[1] 0 5 8 5 4

$`|Utah||5/1/1995||0.671|||1995`
[1] 0 4 8 5 4

$`|Vermont||1970|N/A|1970`
[1] 0 7 4 3 4

$`|Virginia| 5/5/1995||0.660|||1995`
[1] 0 8 9 5 4

$`|Washington||1961|N/A|1961`
[1]  0 10  4  3  4

$`|West Virginia|7/7/1989||0.488|||1990`
[1]  0 13  8  5  4

$`|Wisconsin| 11/1/2011||0.167|||2012`
[1]  0  9 10  5  4

$`|Wyoming||10/1/1994||0.252|||1995`
[1] 0 7 9 5 4
 [1] "|Alabama||1975|N/A|1975"                
 [2] "|Alaska||10/1/1994||0.252|||1995"       
 [3] "|Arizona| 7/17/1994||0.460|||1995"      
 [4] "|Arkansas| 7/27/1995||0.433|||1996"     
 [5] "|California||N/A|N/A|0"                 
 [6] "|Colorado| 5/17/2003||0.627|||2003"     
 [7] "|Connecticut||1970|N/A|1970"            
 [8] "|Delaware||N/A|N/A|0"                   
 [9] "District of Columbia|N/A|N/A|0"         
[10] "|Florida| 10/1/1987||0.252|||1988"      
[11] "|Georgia| 8/25/1989||0.353|||1990"      
[12] "|Hawaii||N/A|N/A|0"                     
[13] "|Idaho||7/1/1990||0.504|||1990"         
[14] "|Illinois| 1/5/2014|N/A|2014"           
[15] "|Indiana| 1/15/1980||0.962|||1980"      
[16] "|Iowa||1/1/2011||1.000|||2011"          
[17] "|Kansas||1/1/2007||1.000|||2007"        
[18] "|Kentucky| 10/1/1996||0.251|||1997"     
[19] "|Louisiana|4/19/1996||0.702|||1996"     
[20] "|Maine||9/19/1985||0.285|||1986"        
[21] "|Maryland||N/A|N/A|0"                   
[22] "|Massachusetts||N/A|N/A|0"              
[23] "|Michigan||7/1/2001||0.504|||2001"      
[24] "|Minnesota| 5/28/2003||0.597|||2003"    
[25] "|Mississippi|7/1/1990||0.504|||1990"    
[26] "|Missouri| 2/26/2004||0.847|||2004"     
[27] "|Montana||10/1/1991||0.252|||1992"      
[28] "|Nebraska||1/1/2007||1.000|||2007"      
[29] "|Nevada||10/1/1995||0.252|||1996"       
[30] "|New Hampshire||1959|N/A|1959"          
[31] "|New Jersey||N/A|N/A|0"                 
[32] "|New Mexico||1/1/2004||1.000|||2004"    
[33] "|New York||N/A|N/A|0"                   
[34] "|North Carolina|12/1/1995||0.085|||1996"
[35] "|North Dakota| 8/1/1985||0.419|||1986"  
[36] "|Ohio||4/8/2004||0.732|||2004"          
[37] "|Oklahoma||1/1/1996||1.000|||1996"      
[38] "|Oregon||1/1/1990||1.000|||1990"        
[39] "|Pennsylvania|6/17/1989||0.542|||1989"  
[40] "|Philadelphia|10/11/1995||0.225|||1996" 
[41] "|Rhode Island||N/A|N/A|0"               
[42] "|South Carolina|8/23/1996||0.358|||1997"
[43] "|South Dakota| 7/1/1985||0.504|||1985"  
[44] "|Tennessee| 10/1/1996||0.251|||1997"    
[45] "|Texas||1/1/1996||1.000|||1996"         
[46] "|Utah||5/1/1995||0.671|||1995"          
[47] "|Vermont||1970|N/A|1970"                
[48] "|Virginia| 5/5/1995||0.660|||1995"      
[49] "|Washington||1961|N/A|1961"             
[50] "|West Virginia|7/7/1989||0.488|||1990"  
[51] "|Wisconsin| 11/1/2011||0.167|||2012"    
[52] "|Wyoming||10/1/1994||0.252|||1995"      
              STATE          E_Date_RTC Frac_Yr_Eff_Yr_Pass         RTC_Date_SA 
        "character"         "character"         "character"         "character" 
       STATE RTC_LAW_YEAR 
 "character"    "numeric" 
       STATE RTC_LAW_YEAR
1    Alabama         1975
2     Alaska         1995
3    Arizona         1995
4   Arkansas         1996
5 California          Inf
6   Colorado         2003

Checkpoint

[1] "YEAR"     "STATE"    "VARIABLE" "VALUE"   
[1] "YEAR"     "STATE"    "VARIABLE" "VALUE"   
[1] "STATE"    "YEAR"     "VALUE"    "VARIABLE"
[1] "YEAR"     "STATE"    "VALUE"    "VARIABLE"
[1] "YEAR"     "VALUE"    "STATE"    "VARIABLE"
# A tibble: 6 x 4
   YEAR STATE   VARIABLE                    VALUE
  <dbl> <chr>   <chr>                       <dbl>
1  1977 Alabama Black_Male_15_to_19_years  1.55  
2  1977 Alabama Black_Male_20_to_39_years  3.04  
3  1977 Alabama Other_Male_15_to_19_years  0.0178
4  1977 Alabama Other_Male_20_to_39_years  0.0642
5  1977 Alabama White_Male_15_to_19_years  3.58  
6  1977 Alabama White_Male_20_to_39_years 11.1   
# A tibble: 6 x 4
   YEAR STATE   VARIABLE                       VALUE
  <dbl> <chr>   <chr>                          <dbl>
1  1977 Alabama Black_Female_10_to_19_years     3.01
2  1977 Alabama Black_Female_20_to_29_years     2.33
3  1977 Alabama Black_Female_30_to_39_years     1.29
4  1977 Alabama Black_Female_40_to_49_years     1.18
5  1977 Alabama Black_Female_50_to_64_years     1.73
6  1977 Alabama Black_Female_65_years_and_over  1.58
# A tibble: 6 x 4
  STATE    YEAR VALUE VARIABLE         
  <chr>   <dbl> <dbl> <chr>            
1 Alabama  1977   7.3 Unemployment_rate
2 Alabama  1978   6.4 Unemployment_rate
3 Alabama  1979   7.2 Unemployment_rate
4 Alabama  1980   8.9 Unemployment_rate
5 Alabama  1981  10.6 Unemployment_rate
6 Alabama  1982  14.1 Unemployment_rate
# A tibble: 6 x 4
   YEAR STATE      VALUE VARIABLE    
  <dbl> <chr>      <dbl> <chr>       
1  2018 Alabama     16   Poverty_rate
2  2018 Alaska      13.1 Poverty_rate
3  2018 Arizona     12.8 Poverty_rate
4  2018 Arkansas    15.9 Poverty_rate
5  2018 California  11.9 Poverty_rate
6  2018 Colorado     9.1 Poverty_rate
# A tibble: 6 x 4
   YEAR VALUE STATE   VARIABLE        
  <dbl> <dbl> <chr>   <chr>           
1  1977 15293 Alabama Viol_crime_count
2  1978 15682 Alabama Viol_crime_count
3  1979 15578 Alabama Viol_crime_count
4  1980 17320 Alabama Viol_crime_count
5  1981 18423 Alabama Viol_crime_count
6  1982 17653 Alabama Viol_crime_count

Join

Donohue, et al.

# A tibble: 33 x 2
    YEAR     n
   <dbl> <int>
 1  1980    52
 2  1981    52
 3  1982    52
 4  1983    52
 5  1984    52
 6  1985    52
 7  1986    52
 8  1987    52
 9  1988    52
10  1989    52
11  1990    52
12  1991    52
13  1992    52
14  1993    52
15  1994    52
16  1995    52
17  1996    52
18  1997    52
19  1998    52
20  1999    52
21  2000    52
22  2001    52
23  2002    52
24  2003    52
25  2004    52
26  2005    52
27  2006    52
28  2007    52
29  2008    52
30  2009    52
31  2010    52
32  2011    52
33  2012    52
             Alabama               Alaska              Arizona 
                  44                   44                   44 
            Arkansas           California             Colorado 
                  44                   44                   44 
         Connecticut                 D.C.             Delaware 
                  44                   33                   44 
District of Columbia              Florida              Georgia 
                  44                   44                   44 
              Hawaii                Idaho             Illinois 
                  44                   44                   44 
             Indiana                 Iowa               Kansas 
                  44                   44                   44 
            Kentucky            Louisiana                Maine 
                  44                   44                   44 
            Maryland        Massachusetts             Michigan 
                  44                   44                   44 
           Minnesota          Mississippi             Missouri 
                  44                   44                   44 
             Montana             Nebraska               Nevada 
                  44                   44                   44 
       New Hampshire           New Jersey           New Mexico 
                  44                   44                   44 
            New York       North Carolina         North Dakota 
                  44                   44                   44 
                Ohio             Oklahoma               Oregon 
                  44                   44                   44 
        Pennsylvania         Rhode Island       South Carolina 
                  44                   44                   44 
        South Dakota            Tennessee                Texas 
                  44                   44                   44 
                Utah              Vermont             Virginia 
                  44                   44                   44 
          Washington        West Virginia            Wisconsin 
                  44                   44                   44 
             Wyoming 
                  44 
[1] 44
             Alabama               Alaska              Arizona 
                  44                   44                   44 
            Arkansas           California             Colorado 
                  44                   44                   44 
         Connecticut District of Columbia             Delaware 
                  44                   77                   44 
             Florida              Georgia               Hawaii 
                  44                   44                   44 
               Idaho             Illinois              Indiana 
                  44                   44                   44 
                Iowa               Kansas             Kentucky 
                  44                   44                   44 
           Louisiana                Maine             Maryland 
                  44                   44                   44 
       Massachusetts             Michigan            Minnesota 
                  44                   44                   44 
         Mississippi             Missouri              Montana 
                  44                   44                   44 
            Nebraska               Nevada        New Hampshire 
                  44                   44                   44 
          New Jersey           New Mexico             New York 
                  44                   44                   44 
      North Carolina         North Dakota                 Ohio 
                  44                   44                   44 
            Oklahoma               Oregon         Pennsylvania 
                  44                   44                   44 
        Rhode Island       South Carolina         South Dakota 
                  44                   44                   44 
           Tennessee                Texas                 Utah 
                  44                   44                   44 
             Vermont             Virginia           Washington 
                  44                   44                   44 
       West Virginia            Wisconsin              Wyoming 
                  44                   44                   44 
[1] 51
             Alabama               Alaska              Arizona 
                  31                   31                   31 
            Arkansas           California             Colorado 
                  31                   31                   31 
         Connecticut District of Columbia             Delaware 
                  31                   31                   31 
             Florida              Georgia               Hawaii 
                  31                   31                   31 
               Idaho             Illinois              Indiana 
                  31                   31                   31 
                Iowa               Kansas             Kentucky 
                  31                   31                   31 
           Louisiana                Maine             Maryland 
                  31                   31                   31 
       Massachusetts             Michigan            Minnesota 
                  31                   31                   31 
         Mississippi             Missouri              Montana 
                  31                   31                   31 
            Nebraska               Nevada        New Hampshire 
                  31                   31                   31 
          New Jersey           New Mexico             New York 
                  31                   31                   31 
      North Carolina         North Dakota                 Ohio 
                  31                   31                   31 
            Oklahoma               Oregon         Pennsylvania 
                  31                   31                   31 
        Rhode Island       South Carolina         South Dakota 
                  31                   31                   31 
           Tennessee                Texas                 Utah 
                  31                   31                   31 
             Vermont             Virginia           Washington 
                  31                   31                   31 
       West Virginia            Wisconsin              Wyoming 
                  31                   31                   31 
              Alaska              Arizona             Arkansas 
                  31                   31                   31 
          California             Colorado District of Columbia 
                  31                   31                   31 
            Delaware              Florida              Georgia 
                  31                   31                   31 
              Hawaii                Idaho             Illinois 
                  31                   31                   31 
                Iowa               Kansas             Kentucky 
                  31                   31                   31 
           Louisiana                Maine             Maryland 
                  31                   31                   31 
       Massachusetts             Michigan            Minnesota 
                  31                   31                   31 
         Mississippi             Missouri              Montana 
                  31                   31                   31 
            Nebraska               Nevada           New Jersey 
                  31                   31                   31 
          New Mexico             New York       North Carolina 
                  31                   31                   31 
        North Dakota                 Ohio             Oklahoma 
                  31                   31                   31 
              Oregon         Pennsylvania         Rhode Island 
                  31                   31                   31 
      South Carolina         South Dakota            Tennessee 
                  31                   31                   31 
               Texas                 Utah             Virginia 
                  31                   31                   31 
       West Virginia            Wisconsin              Wyoming 
                  31                   31                   31 
[1] 45

Lott and Mustard

# A tibble: 33 x 2
    YEAR     n
   <dbl> <int>
 1  1980    52
 2  1981    52
 3  1982    52
 4  1983    52
 5  1984    52
 6  1985    52
 7  1986    52
 8  1987    52
 9  1988    52
10  1989    52
11  1990    52
12  1991    52
13  1992    52
14  1993    52
15  1994    52
16  1995    52
17  1996    52
18  1997    52
19  1998    52
20  1999    52
21  2000    52
22  2001    52
23  2002    52
24  2003    52
25  2004    52
26  2005    52
27  2006    52
28  2007    52
29  2008    52
30  2009    52
31  2010    52
32  2011    52
33  2012    52
             Alabama               Alaska              Arizona 
                  44                   44                   44 
            Arkansas           California             Colorado 
                  44                   44                   44 
         Connecticut                 D.C.             Delaware 
                  44                   33                   44 
District of Columbia              Florida              Georgia 
                  44                   44                   44 
              Hawaii                Idaho             Illinois 
                  44                   44                   44 
             Indiana                 Iowa               Kansas 
                  44                   44                   44 
            Kentucky            Louisiana                Maine 
                  44                   44                   44 
            Maryland        Massachusetts             Michigan 
                  44                   44                   44 
           Minnesota          Mississippi             Missouri 
                  44                   44                   44 
             Montana             Nebraska               Nevada 
                  44                   44                   44 
       New Hampshire           New Jersey           New Mexico 
                  44                   44                   44 
            New York       North Carolina         North Dakota 
                  44                   44                   44 
                Ohio             Oklahoma               Oregon 
                  44                   44                   44 
        Pennsylvania         Rhode Island       South Carolina 
                  44                   44                   44 
        South Dakota            Tennessee                Texas 
                  44                   44                   44 
                Utah              Vermont             Virginia 
                  44                   44                   44 
          Washington        West Virginia            Wisconsin 
                  44                   44                   44 
             Wyoming 
                  44 
[1] 44
             Alabama               Alaska              Arizona 
                  44                   44                   44 
            Arkansas           California             Colorado 
                  44                   44                   44 
         Connecticut District of Columbia             Delaware 
                  44                   77                   44 
             Florida              Georgia               Hawaii 
                  44                   44                   44 
               Idaho             Illinois              Indiana 
                  44                   44                   44 
                Iowa               Kansas             Kentucky 
                  44                   44                   44 
           Louisiana                Maine             Maryland 
                  44                   44                   44 
       Massachusetts             Michigan            Minnesota 
                  44                   44                   44 
         Mississippi             Missouri              Montana 
                  44                   44                   44 
            Nebraska               Nevada        New Hampshire 
                  44                   44                   44 
          New Jersey           New Mexico             New York 
                  44                   44                   44 
      North Carolina         North Dakota                 Ohio 
                  44                   44                   44 
            Oklahoma               Oregon         Pennsylvania 
                  44                   44                   44 
        Rhode Island       South Carolina         South Dakota 
                  44                   44                   44 
           Tennessee                Texas                 Utah 
                  44                   44                   44 
             Vermont             Virginia           Washington 
                  44                   44                   44 
       West Virginia            Wisconsin              Wyoming 
                  44                   44                   44 
[1] 51
             Alabama               Alaska              Arizona 
                  31                   31                   31 
            Arkansas           California             Colorado 
                  31                   31                   31 
         Connecticut District of Columbia             Delaware 
                  31                   31                   31 
             Florida              Georgia               Hawaii 
                  31                   31                   31 
               Idaho             Illinois              Indiana 
                  31                   31                   31 
                Iowa               Kansas             Kentucky 
                  31                   31                   31 
           Louisiana                Maine             Maryland 
                  31                   31                   31 
       Massachusetts             Michigan            Minnesota 
                  31                   31                   31 
         Mississippi             Missouri              Montana 
                  31                   31                   31 
            Nebraska               Nevada        New Hampshire 
                  31                   31                   31 
          New Jersey           New Mexico             New York 
                  31                   31                   31 
      North Carolina         North Dakota                 Ohio 
                  31                   31                   31 
            Oklahoma               Oregon         Pennsylvania 
                  31                   31                   31 
        Rhode Island       South Carolina         South Dakota 
                  31                   31                   31 
           Tennessee                Texas                 Utah 
                  31                   31                   31 
             Vermont             Virginia           Washington 
                  31                   31                   31 
       West Virginia            Wisconsin              Wyoming 
                  31                   31                   31 
              Alaska              Arizona             Arkansas 
                  31                   31                   31 
          California             Colorado District of Columbia 
                  31                   31                   31 
            Delaware              Florida              Georgia 
                  31                   31                   31 
              Hawaii                Idaho             Illinois 
                  31                   31                   31 
                Iowa               Kansas             Kentucky 
                  31                   31                   31 
           Louisiana                Maine             Maryland 
                  31                   31                   31 
       Massachusetts             Michigan            Minnesota 
                  31                   31                   31 
         Mississippi             Missouri              Montana 
                  31                   31                   31 
            Nebraska               Nevada           New Jersey 
                  31                   31                   31 
          New Mexico             New York       North Carolina 
                  31                   31                   31 
        North Dakota                 Ohio             Oklahoma 
                  31                   31                   31 
              Oregon         Pennsylvania         Rhode Island 
                  31                   31                   31 
      South Carolina         South Dakota            Tennessee 
                  31                   31                   31 
               Texas                 Utah             Virginia 
                  31                   31                   31 
       West Virginia            Wisconsin              Wyoming 
                  31                   31                   31 
[1] 45

Data Exploration


                    STATE                      YEAR Black_Male_15_to_19_years 
                 "factor"                 "numeric"                 "numeric" 
Black_Male_20_to_39_years Other_Male_15_to_19_years Other_Male_20_to_39_years 
                "numeric"                 "numeric"                 "numeric" 
White_Male_15_to_19_years White_Male_20_to_39_years         Unemployment_rate 
                "numeric"                 "numeric"                 "numeric" 
             Poverty_rate          Viol_crime_count                Population 
                "numeric"                 "numeric"                 "numeric" 
      police_per_100k_lag              RTC_LAW_YEAR                   RTC_LAW 
                "numeric"                 "numeric"                 "logical" 
                   TIME_0                  TIME_INF        Viol_crime_rate_1k 
                "numeric"                 "numeric"                 "numeric" 
   Viol_crime_rate_1k_log            Population_log 
                "numeric"                 "numeric" 

Data Analysis


Donohue, et al.

Some code taken from http://karthur.org/2019/implementing-fixed-effects-panel-models-in-r.html

Twoways effects Within Model

Call:
plm(formula = Viol_crime_rate_1k_log ~ RTC_LAW + White_Male_15_to_19_years + 
    White_Male_20_to_39_years + Black_Male_15_to_19_years + Black_Male_20_to_39_years + 
    Other_Male_15_to_19_years + Other_Male_20_to_39_years + Unemployment_rate + 
    Poverty_rate + Population_log + police_per_100k_lag, data = d_panel_DONOHUE, 
    effect = "twoways", model = "within")

Balanced Panel: n = 45, T = 31, N = 1395

Residuals:
      Min.    1st Qu.     Median    3rd Qu.       Max. 
-0.5716985 -0.0933827  0.0022014  0.0896372  1.0943035 

Coefficients:
                             Estimate  Std. Error t-value  Pr(>|t|)    
RTC_LAWTRUE                0.02306214  0.01666508  1.3839 0.1666372    
White_Male_15_to_19_years -0.00263364  0.02732105 -0.0964 0.9232208    
White_Male_20_to_39_years  0.04060493  0.00960488  4.2275 2.527e-05 ***
Black_Male_15_to_19_years -0.10348754  0.05695300 -1.8171 0.0694351 .  
Black_Male_20_to_39_years  0.12003823  0.01938589  6.1920 7.934e-10 ***
Other_Male_15_to_19_years  0.66332029  0.11311115  5.8643 5.703e-09 ***
Other_Male_20_to_39_years -0.25380488  0.03938074 -6.4449 1.622e-10 ***
Unemployment_rate         -0.01626228  0.00490799 -3.3134 0.0009468 ***
Poverty_rate              -0.00890507  0.00295638 -3.0122 0.0026438 ** 
Population_log            -0.22442622  0.06060682 -3.7030 0.0002219 ***
police_per_100k_lag        0.00047990  0.00013737  3.4935 0.0004926 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Total Sum of Squares:    43.211
Residual Sum of Squares: 36.917
R-Squared:      0.14565
Adj. R-Squared: 0.090168
F-statistic: 20.2864 on 11 and 1309 DF, p-value: < 2.22e-16

Lott and Mustard

Some code taken from http://karthur.org/2019/implementing-fixed-effects-panel-models-in-r.html

Twoways effects Within Model

Call:
plm(formula = LOTT_fmla, data = d_panel_LOTT, effect = "twoways", 
    model = "within")

Balanced Panel: n = 45, T = 31, N = 1395

Residuals:
     Min.   1st Qu.    Median   3rd Qu.      Max. 
-0.565457 -0.078747  0.001635  0.079232  0.577838 

Coefficients:
                                  Estimate  Std. Error  t-value  Pr(>|t|)    
RTC_LAWTRUE                    -0.05422970  0.01658286  -3.2702  0.001103 ** 
White_Female_10_to_19_years     0.65063823  0.15149131   4.2949 1.880e-05 ***
White_Female_20_to_29_years    -0.02997137  0.06349534  -0.4720  0.636990    
White_Female_30_to_39_years     0.13132568  0.08104309   1.6204  0.105384    
White_Female_40_to_49_years     0.09211246  0.08234849   1.1186  0.263534    
White_Female_50_to_64_years    -0.37475798  0.06335128  -5.9156 4.240e-09 ***
White_Female_65_years_and_over  0.20314547  0.04759664   4.2681 2.117e-05 ***
White_Male_10_to_19_years      -0.61566593  0.14489592  -4.2490 2.303e-05 ***
White_Male_20_to_29_years       0.06466063  0.05901511   1.0957  0.273433    
White_Male_30_to_39_years      -0.10412806  0.08620494  -1.2079  0.227304    
White_Male_40_to_49_years      -0.21815118  0.07329480  -2.9764  0.002972 ** 
White_Male_50_to_64_years       0.38433281  0.07355515   5.2251 2.031e-07 ***
White_Male_65_years_and_over   -0.21601720  0.06691569  -3.2282  0.001277 ** 
Black_Female_10_to_19_years    -1.20662463  0.43502280  -2.7737  0.005623 ** 
Black_Female_20_to_29_years     0.02942780  0.17544389   0.1677  0.866820    
Black_Female_30_to_39_years    -0.15149500  0.20475568  -0.7399  0.459508    
Black_Female_40_to_49_years     0.42380646  0.23611111   1.7949  0.072898 .  
Black_Female_50_to_64_years     0.13802304  0.21419499   0.6444  0.519444    
Black_Female_65_years_and_over -0.07820224  0.24128320  -0.3241  0.745908    
Black_Male_10_to_19_years       1.36102016  0.44538035   3.0559  0.002291 ** 
Black_Male_20_to_29_years      -0.14034048  0.18460396  -0.7602  0.447260    
Black_Male_30_to_39_years       0.37937138  0.23590699   1.6081  0.108051    
Black_Male_40_to_49_years      -0.58107771  0.27188867  -2.1372  0.032772 *  
Black_Male_50_to_64_years      -0.25317586  0.24011393  -1.0544  0.291899    
Black_Male_65_years_and_over   -0.46825225  0.34645213  -1.3516  0.176754    
Other_Female_10_to_19_years     0.57481127  0.49957581   1.1506  0.250112    
Other_Female_20_to_29_years    -1.12453492  0.27172673  -4.1385 3.725e-05 ***
Other_Female_30_to_39_years    -3.15698149  0.35788016  -8.8213 < 2.2e-16 ***
Other_Female_40_to_49_years     0.96646809  0.42423419   2.2781  0.022882 *  
Other_Female_50_to_64_years     2.97254960  0.34040734   8.7323 < 2.2e-16 ***
Other_Female_65_years_and_over  2.25872753  0.20551782  10.9904 < 2.2e-16 ***
Other_Male_10_to_19_years       0.24715044  0.48305107   0.5116  0.608988    
Other_Male_20_to_29_years       1.58436219  0.25907190   6.1155 1.276e-09 ***
Other_Male_30_to_39_years       2.91519635  0.41689628   6.9926 4.336e-12 ***
Other_Male_40_to_49_years      -1.22100778  0.44740943  -2.7291  0.006439 ** 
Other_Male_50_to_64_years      -3.92082993  0.37595040 -10.4291 < 2.2e-16 ***
Other_Male_65_years_and_over   -4.10090950  0.37041352 -11.0712 < 2.2e-16 ***
Unemployment_rate              -0.00499765  0.00437844  -1.1414  0.253907    
Poverty_rate                   -0.00571967  0.00254133  -2.2507  0.024576 *  
Population_log                 -0.26192101  0.08472606  -3.0914  0.002035 ** 
police_per_100k_lag             0.00051043  0.00012220   4.1771 3.153e-05 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Total Sum of Squares:    43.211
Residual Sum of Squares: 23.825
R-Squared:      0.44863
Adj. R-Squared: 0.39906
F-statistic: 25.3824 on 41 and 1279 DF, p-value: < 2.22e-16

Multicollinearity analysis

How did the above happen?

The analysis dataframes are very similar yet rendered very different results.

- different number of columns: 20 vs 50
[1] TRUE

The only difference between the two dataframes rests in how the demographic variables were parameterized.

[1] "Black_Male_15_to_19_years" "Black_Male_20_to_39_years"
[3] "Other_Male_15_to_19_years" "Other_Male_20_to_39_years"
[5] "White_Male_15_to_19_years" "White_Male_20_to_39_years"
 [1] "Black_Female_10_to_19_years"    "Black_Female_20_to_29_years"   
 [3] "Black_Female_30_to_39_years"    "Black_Female_40_to_49_years"   
 [5] "Black_Female_50_to_64_years"    "Black_Female_65_years_and_over"
 [7] "Black_Male_10_to_19_years"      "Black_Male_20_to_29_years"     
 [9] "Black_Male_30_to_39_years"      "Black_Male_40_to_49_years"     
[11] "Black_Male_50_to_64_years"      "Black_Male_65_years_and_over"  
[13] "Other_Female_10_to_19_years"    "Other_Female_20_to_29_years"   
[15] "Other_Female_30_to_39_years"    "Other_Female_40_to_49_years"   
[17] "Other_Female_50_to_64_years"    "Other_Female_65_years_and_over"
[19] "Other_Male_10_to_19_years"      "Other_Male_20_to_29_years"     
[21] "Other_Male_30_to_39_years"      "Other_Male_40_to_49_years"     
[23] "Other_Male_50_to_64_years"      "Other_Male_65_years_and_over"  
[25] "White_Female_10_to_19_years"    "White_Female_20_to_29_years"   
[27] "White_Female_30_to_39_years"    "White_Female_40_to_49_years"   
[29] "White_Female_50_to_64_years"    "White_Female_65_years_and_over"
[31] "White_Male_10_to_19_years"      "White_Male_20_to_29_years"     
[33] "White_Male_30_to_39_years"      "White_Male_40_to_49_years"     
[35] "White_Male_50_to_64_years"      "White_Male_65_years_and_over"  

Clearly, this had an effect on the results of the analysis.

Let’s explore how this occured.

When seemingly independent variables are highly related to one another, the relationships estimated in an analysis may be distorted.

In regression analysis, this distortion is often a byproduct of a violation of the independence assumption. This distortion, if large enough, can impact statistical inference.

There are several ways we can diagnose multicollinearity.

Correlation

Again, multicollinearity often occurs when independent variables are highly related to one another. Consequently, we can evaluate these relationships be examining the correlation between variable pairs.

It is important to note that multicollinearity and correlation are not one and the same. Correlation can be thought of as the strength of the relationship between variables. On the other hand, multicollinearity can be thought of the the violation of the independence assumption that is a consequence of this correlation in a regression analysis.

Scatterplots

 [1] "STATE"                     "YEAR"                     
 [3] "Black_Male_15_to_19_years" "Black_Male_20_to_39_years"
 [5] "Other_Male_15_to_19_years" "Other_Male_20_to_39_years"
 [7] "White_Male_15_to_19_years" "White_Male_20_to_39_years"
 [9] "Unemployment_rate"         "Poverty_rate"             
[11] "Viol_crime_count"          "Population"               
[13] "police_per_100k_lag"       "RTC_LAW_YEAR"             
[15] "RTC_LAW"                   "TIME_0"                   
[17] "TIME_INF"                  "Viol_crime_rate_1k"       
[19] "Viol_crime_rate_1k_log"    "Population_log"           

Coefficient estimate instability

sims <- 250

# DONOHUE

# round(dim(DONOHUE_DF)[1]/2)
samps_DONOHUE <- lapply(rep(dim(DONOHUE_DF)[1]-1, sims),
       function(x)DONOHUE_DF[sample(nrow(DONOHUE_DF),
                                     size = x, replace = FALSE),])

fit_nls_on_bootstrap_DONOHUE <- function(split){
  plm(Viol_crime_rate_1k_log ~
                        RTC_LAW +
                        White_Male_15_to_19_years +
                        White_Male_20_to_39_years +
                        Black_Male_15_to_19_years +
                        Black_Male_20_to_39_years +
                        Other_Male_15_to_19_years +
                        Other_Male_20_to_39_years +
                        Unemployment_rate +
                        Poverty_rate + 
                        Population_log + 
                        police_per_100k_lag,
      data = data.frame(split),
      index = c("STATE","YEAR"),
      model = "within",
      effect = "twoways")
}
  
samps_models_DONOHUE <- lapply(samps_DONOHUE, fit_nls_on_bootstrap_DONOHUE)

samps_models_DONOHUE <- samps_models_DONOHUE %>%
  map(tidy)

names(samps_models_DONOHUE) <- paste0("DONOHUE_",1:length(samps_models_DONOHUE))

simulations_DONOHUE <- samps_models_DONOHUE %>%
  bind_rows(.id = "ID") %>%
  mutate(Analysis = "Analysis 1")

## LOTT

samps_LOTT <- lapply(rep(round(dim(LOTT_DF)[1]/2), sims),
       function(x) LOTT_DF[sample(nrow(LOTT_DF),
                                  size = x, replace = FALSE),])

fit_nls_on_bootstrap_LOTT <- function(split){
  plm(LOTT_fmla,
      data = data.frame(split),
      index = c("STATE","YEAR"),
      model = "within",
      effect = "twoways")
}
  
samps_models_LOTT <- lapply(samps_LOTT, fit_nls_on_bootstrap_LOTT)

samps_models_LOTT <- samps_models_LOTT %>%
  map(tidy)

names(samps_models_LOTT) <- paste0("LOTT_",1:length(samps_models_LOTT))

simulations_LOTT <- samps_models_LOTT %>%
  bind_rows(.id = "Analysis") %>%
  mutate(Analysis = "Analysis 2")

simulations <- bind_rows(simulations_DONOHUE,
                         simulations_LOTT)

simulation_plot <- simulations %>%
  filter(term=="RTC_LAWTRUE") %>%
  ggplot(aes(x = Analysis, y = estimate)) + 
  geom_jitter(alpha = 0.25,
              width = 0.1) + 
  labs(title = "Coefficient instability",
       subtitle = "Estimates sensitive to observation deletions",
       x = "Term",
       y = "Coefficient",
       caption = "Results from simulations") + 
  theme_minimal() +
  theme(axis.title.x = element_blank())

simulation_plot

VIF

              RTC_LAWTRUE White_Male_15_to_19_years White_Male_20_to_39_years 
                 1.095268                  1.172703                  1.685342 
Black_Male_15_to_19_years Black_Male_20_to_39_years Other_Male_15_to_19_years 
                 1.313339                  1.656860                  1.574839 
Other_Male_20_to_39_years         Unemployment_rate              Poverty_rate 
                 1.623750                  1.242150                  1.262682 
           Population_log       police_per_100k_lag 
                 1.154825                  1.163058 
                   RTC_LAWTRUE    White_Female_10_to_19_years 
                      1.641916                     127.733327 
   White_Female_20_to_29_years    White_Female_30_to_39_years 
                     42.184712                      49.980961 
   White_Female_40_to_49_years    White_Female_50_to_64_years 
                     37.856684                      36.547007 
White_Female_65_years_and_over      White_Male_10_to_19_years 
                     12.863500                     126.795600 
     White_Male_20_to_29_years      White_Male_30_to_39_years 
                     39.477520                      73.002593 
     White_Male_40_to_49_years      White_Male_50_to_64_years 
                     31.686738                      52.974511 
  White_Male_65_years_and_over    Black_Female_10_to_19_years 
                     13.311999                     330.982883 
   Black_Female_20_to_29_years    Black_Female_30_to_39_years 
                    106.841150                      78.289450 
   Black_Female_40_to_49_years    Black_Female_50_to_64_years 
                     98.421635                      66.551531 
Black_Female_65_years_and_over      Black_Male_10_to_19_years 
                     48.358137                     318.032781 
     Black_Male_20_to_29_years      Black_Male_30_to_39_years 
                     89.283293                      87.978290 
     Black_Male_40_to_49_years      Black_Male_50_to_64_years 
                     91.913602                      64.235719 
  Black_Male_65_years_and_over    Other_Female_10_to_19_years 
                     37.575659                     143.610940 
   Other_Female_20_to_29_years    Other_Female_30_to_39_years 
                     65.320481                      55.395405 
   Other_Female_40_to_49_years    Other_Female_50_to_64_years 
                    222.043147                     132.105354 
Other_Female_65_years_and_over      Other_Male_10_to_19_years 
                     82.816114                     153.770551 
     Other_Male_20_to_29_years      Other_Male_30_to_39_years 
                     54.915467                      63.326933 
     Other_Male_40_to_49_years      Other_Male_50_to_64_years 
                    241.793319                     174.690518 
  Other_Male_65_years_and_over              Unemployment_rate 
                     53.654443                       1.496689 
                  Poverty_rate                 Population_log 
                      1.412607                       3.416913 
           police_per_100k_lag 
                      1.393440 
[1] 1.685342
[1] 330.9829

\[\frac{1}{1-R_{i}^{2}}\]

Synthesis

Data Visualization


Summary


Suggested Homework


LS0tCnRpdGxlOiAiT3BlbiBDYXNlIFN0dWRpZXM6IEV4YW1pbmF0aW9uIG9mIE11bHRpY29sbGluZWFyaXR5IEluZmx1ZW5jZSBvbiBJbmZlcmVuY2UgVXNpbmcgUmlnaHQtdG8tQ2FycnkgR3VuIExhdyBhbmQgVmlvbGVudCBDcmltZSBEYXRhIgphdXRob3I6ICJNaWNoYWVsIE9udGl2ZXJvcywgQ2FycmllIFdyaWdodCwgUGhELiIKY3NzOiBzdHlsZS5jc3MKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBzZWxmX2NvbnRhaW5lZDogeWVzCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIG51bWJlcl9zZWN0aW9uczogbm8KICAgIHRoZW1lOiBjb3NtbwogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKLS0tCgo8c3R5bGU+CiNUT0MgewogIGJhY2tncm91bmQ6IHVybCgiaHR0cHM6Ly9vcGVuY2FzZXN0dWRpZXMuZ2l0aHViLmlvL2ltZy9sb2dvLmpwZyIpOwogIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsKICBwYWRkaW5nLXRvcDogMjQwcHggIWltcG9ydGFudDsKICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Owp9Cjwvc3R5bGU+CgoKLS0tCgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChpbmNsdWRlID0gVFJVRSwgY29tbWVudCA9IE5BLCBlY2hvID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBjYWNoZSA9IEZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywKICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBvdXQud2lkdGggPSAnOTAlJykKbGlicmFyeShoZXJlKQpsaWJyYXJ5KGtuaXRyKQpgYGAKCiMjIyMgey5vdXRsaW5lIH0KYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoID0gIjgwMCBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJtYWlucGxvdC5wbmciKSkKYGBgCgojIyMjCgojIyB7LmRpc2NsYWltZXJfYmxvY2t9CgoqKkRpc2NsYWltZXIqKjogVGhlIHB1cnBvc2Ugb2YgdGhlIFtPcGVuIENhc2UgU3R1ZGllc10oaHR0cHM6Ly9vcGVuY2FzZXN0dWRpZXMuZ2l0aHViLmlvKXt0YXJnZXQ9Il9ibGFuayJ9IHByb2plY3QgaXMgKip0byBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIHZhcmlvdXMgZGF0YSBzY2llbmNlIG1ldGhvZHMsIHRvb2xzLCBhbmQgc29mdHdhcmUgaW4gdGhlIGNvbnRleHQgb2YgbWVzc3ksIHJlYWwtd29ybGQgZGF0YSoqLiBBIGdpdmVuIGNhc2Ugc3R1ZHkgZG9lcyBub3QgY292ZXIgYWxsIGFzcGVjdHMgb2YgdGhlIHJlc2VhcmNoIHByb2Nlc3MsIGlzIG5vdCBjbGFpbWluZyB0byBiZSB0aGUgbW9zdCBhcHByb3ByaWF0ZSB3YXkgdG8gYW5hbHl6ZSBhIGdpdmVuIGRhdGEgc2V0LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjb250ZXh0IG9mIG1ha2luZyBwb2xpY3kgZGVjaXNpb25zIHdpdGhvdXQgZXh0ZXJuYWwgY29uc3VsdGF0aW9uIGZyb20gc2NpZW50aWZpYyBleHBlcnRzLiAKCiMjIHsubGlzY2VuY2VfYmxvY2t9CgpUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tTm9uQ29tbWVyY2lhbCAzLjAgWyhDQyBCWS1OQyAzLjApXShodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMvMy4wL3VzLyl7dGFyZ2V0PSJfYmxhbmsifSAgVW5pdGVkIFN0YXRlcyBMaWNlbnNlLgoKIyAqKk1vdGl2YXRpb24qKgoqKiogCgpUaGlzIGNhc2Ugc3R1ZHkgd2lsbCBpbnRyb2R1Y2UgdGhlIHRvcGljIG9mIG11bHRpY29saW5lYXJpdHkuIFdlIHdpbGwgZG8gc28gYnkgc2hvd2Nhc2luZyBhIHJlYWwgd29ybGQgZXhhbXBsZSB3aGVyZSBtdWx0aWNvbGluZWFyaXR5IGluIHBhcnQgcmVzdWx0ZWQgaW4gaGlzdG9yaWNhbGx5IGNvbnRyaXZlcnNpYWwgYW5kIGNvbmZsaWN0aW5nIGZpbmRpbmdzIGFib3V0IHRoZSBpbmZsdWVuY2Ugb2YgdGhlIGFkb3B0aW9uIG9mIHJpZ2h0LXRvLWNhcnJ5IChSVEMpIGNvbmNlYWxlZCBoYW5kZ3VuIGxhd3Mgb24gdmlvbGVudCBjcmltZSByYXRlcyBpbiB0aGUgVW5pdGVkIFN0YXRlcy4gCgpXZSB3aWxsIGZvY3VzIG9uIHR3byBhcnRpY2xlczoKCjEpIFRoZSBmaXJzdCBhbmFseXNpcyBieSBbTG90dCBhbmQgTXVzdGFyZF0oaHR0cHM6Ly9jaGljYWdvdW5ib3VuZC51Y2hpY2Fnby5lZHUvY2dpL3ZpZXdjb250ZW50LmNnaT9hcnRpY2xlPTExNTAmY29udGV4dD1sYXdfYW5kX2Vjb25vbWljcyl7dGFyZ2V0PSJfYmxhbmsifSBwdWJsaXNoZWQgaW4gMTk5NiBzdWdnZXN0cyB0aGF0IFJUQyBsYXdzIHJlZHVjZSB2aW9sZW50IGNyaW1lLiBMb3R0IGF1dGhvcmVkIGEgYm9vayBleHRlbmRpbmcgdGhlc2UgZmluZGluZ3MgaW4gMTk5OCBjYWxsZWQgWyoqKk1vcmUgR3VucywgTGVzcyBDcmltZSoqKl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9yZV9HdW5zLF9MZXNzX0NyaW1lKXt0YXJnZXQ9Il9ibGFuayJ9LgoKYGBge3IsIGVjaG89RkFMU0UsIG91dC5oZWlnaHQgPSAnMTAwJScsIG91dC53aWR0aCA9ICcxMDAlJywgZmlnLmFsaWduPSdjZW50ZXInfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlKCJpbWciLCAiTG90dC5wbmciKSkKYGBgCgoyKSBUaGUgc2Vjb25kIGFuYWx5c2lzIGlzIGEgcmVjZW50IGFydGljbGUgYnkgW0Rvbm9odWUsIGV0IGFsLl0oaHR0cHM6Ly93d3cubmJlci5vcmcvcGFwZXJzL3cyMzUxMC5wZGYpe3RhcmdldD0iX2JsYW5rIn0gcHVibGlzaGVkIGluIDIwMTcgdGhhdCBzdWdnZXN0cyB0aGF0IFJUQyBsYXdzIGluY3JlYXNlIHZpb2xlbnQgY3JpbWUuIERvbm9odWUgaGFzIGFsc28gcHVibGlzaGVkIHByZXZpb3VzIGFydGljbGVzIHdpdGggdGl0bGVzIHN1Y2ggYXMgWyoqKiJTaG9vdGluZyBkb3duIHRoZSAiTW9yZSBHdW5zLCBMZXNzIENyaW1lIiBIeXBvdGhlc2lzKioqXShodHRwczovL3d3dy5qc3Rvci5vcmcvc3RhYmxlLzEyMjk2MDM/c2VxPTEpe3RhcmdldD0iX2JsYW5rIn0gCgpgYGB7ciwgZWNobz1GQUxTRSwgb3V0LmhlaWdodCA9ICcxMDAlJywgb3V0LndpZHRoID0gJzEwMCUnLCBmaWcuYWxpZ249J2NlbnRlcid9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmUoImltZyIsICJEb25vaHVlLnBuZyIpKQpgYGAKClRoaXMgaGFzIGJlZW4gYSBjb250cm92ZXJzaWFsIHRvcGljIGFzIG1hbnkgb3RoZXIgYXJ0aWNsZXMgYWxzbyBoYWQgY29uZmxpY3RpbmcgcmVzdWx0cy4gU2VlIFtoZXJlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Nb3JlX0d1bnMsX0xlc3NfQ3JpbWUpe3RhcmdldD0iX2JsYW5rIn0gZm9yIGEgbGlzdCBvZiBzdHVkaWVzLgoKVGhlIFtEb25vaHVlLCBldCBhbC5dKGh0dHBzOi8vd3d3Lm5iZXIub3JnL3BhcGVycy93MjM1MTAucGRmKXt0YXJnZXQ9Il9ibGFuayJ9IGFydGljbGUgZGlzY3Vzc2VzIGhvdyB0aGVyZSBhcmUgbWFueSBvdGhlciBpbXBvcnRhbnQgbWV0aG9kb2xpY2FsIGFzcGVjdHMgYmVzaWRlcyBtdWx0aWNvbGluZWFyaXR5IHRoYXQgY291bGQgYWNjb3VudCBmb3IgdGhlIGhpc3RvcmljYWxseSBjb25mbGljdGluZyByZXN1bHRzIGluIHRoZXNlIHByZXZpb3VzIHBhcGVycy4KCkluIGZhY3QsIG5lYXJseSBldmVyeSBhc3BlY3Qgb2YgdGhlIGRhdGEgYW5hbHlzaXMgcHJvY2VzcyB3YXMgZGlmZmVyZW50IGJldHdlZW4gdGhlIFtEb25vaHVlLCBldCBhbC5dKGh0dHBzOi8vd3d3Lm5iZXIub3JnL3BhcGVycy93MjM1MTAucGRmKXt0YXJnZXQ9Il9ibGFuayJ9IGFuYWx5c2lzIGFuZCB0aGUgW0xvdHQgYW5kIE11c3RhcmRdKGh0dHBzOi8vY2hpY2Fnb3VuYm91bmQudWNoaWNhZ28uZWR1L2NnaS92aWV3Y29udGVudC5jZ2k/YXJ0aWNsZT0xMTUwJmNvbnRleHQ9bGF3X2FuZF9lY29ub21pY3Mpe3RhcmdldD0iX2JsYW5rIn0gYW5hbHlzaXMuCgpgYGB7ciwgZWNobz1GQUxTRSwgb3V0LmhlaWdodCA9ICc3NSUnLCBvdXQud2lkdGggPSAnNzUlJywgZmlnLmFsaWduPSdjZW50ZXInfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlKCJpbWciLCAiRWR1Y2F0aW9uYWxfR3JhcGhpYzEuanBnIikpCmBgYAoKSG93ZXZlciwgd2Ugd2lsbCBmb2N1cyBwYXJ0aWN1bGFybHkgb24gbXVsdGljb2xpbmVhcml0eSBhbmQgd2Ugd2lsbCBleHBsb3JlIGhvdyBpdCBjYW4gaW5mbHVlbmNlIGxpbmVhciByZWdyZXNzaW9uIGFuYWx5c2VzIGFuZCByZXN1bHQgaW4gZGlmZmVyZW50IGNvbmNsdXNpb25zLiAKClRoaXMgYW5hbHlzaXMgd2lsbCBkZW1vbnN0cmF0ZSBob3cgbWV0aG9kb2xvZ2ljYWwgZGV0YWlscyBjYW4gYmUgY3JpdGljYWxseSBpbmZsdWVudGlhbCBmb3Igb3VyIG92ZXJhbGwgY29uY2x1c2lvbnMgYW5kIGNhbiByZXN1bHQgaW4gaW1wb3J0YW50IHBvbGljeSByZWxhdGVkIGNvbnNlcXVlbmNlcy4gVGhpcyBbYXJ0aWNsZV0oKGh0dHBzOi8vd3d3Lm5iZXIub3JnL3BhcGVycy93MjM1MTAucGRmKXt0YXJnZXQ9Il9ibGFuayJ9KSB3aWxsIHByb3ZpZGUgYSBiYXNpcyBmb3IgdGhlIG1vdGl2YXRpb24uIAoKIyMjIyB7LnJlZmVyZW5jZV9ibG9ja30KCkpvaG4gSi4gRG9ub2h1ZSBldCBhbC4sIFJpZ2h04oCQdG/igJBDYXJyeSBMYXdzIGFuZCBWaW9sZW50IENyaW1lOiBBIENvbXByZWhlbnNpdmUgQXNzZXNzbWVudCBVc2luZyBQYW5lbCBEYXRhIGFuZCBhIFN0YXRl4oCQTGV2ZWwgU3ludGhldGljIENvbnRyb2wgQW5hbHlzaXMuICpKb3VybmFsIG9mIEVtcGlyaWNhbCBMZWdhbCBTdHVkaWVzKiwgMTYsMiAoMjAxOSkuCgpEYXZpZCBCLiBNdXN0YXJkICYgSm9obiBMb3R0LiBDcmltZSwgRGV0ZXJyZW5jZSwgYW5kIFJpZ2h0LXRvLUNhcnJ5IENvbmNlYWxlZCBIYW5kZ3Vucy4gKkNvYXNlLVNhbmRvciBJbnN0aXR1dGUgZm9yIExhdyAmIEVjb25vbWljcyogV29ya2luZyBQYXBlciBOby4gNDEsICgxOTk2KS4KCiMjIyMKCgpIZXJlIHlvdSBjYW4gc2VlIHRoZSBkaWZmZXJlbmNlcyBpbiB0aGUgZGF0YSB1c2VkIGluIHRoZSBmZWF0dXJlZCBSVEMgYXJ0aWNsZXM6CgoKYGBge3IsIGVjaG89RkFMU0UsIG91dC5oZWlnaHQgPSAnMTAwJScsIG91dC53aWR0aCA9ICcxMDAlJywgZmlnLmFsaWduPSdjZW50ZXInfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlKCJpbWciLCdEb25vaHVlX1RhYmxlMi5wbmcnKSkKYGBgCgoKV2Ugd2lsbCBwZXJmb3JtIGFuYWx5c2VzIHNpbWlsYXIgdG8gdGhvc2UgaW4gdGhlc2UgYXJ0aWNsZXMsIGhvd2V2ZXIgKip3ZSB3aWxsIG5vdCB0cnkgdG8gcmVjcmVhdGUgdGhlbSoqLCBpbnN0ZWFkIHdlIHdpbGwgc2ltcGxpZnkgb3VyIGFuYWx5c2lzIHRvIGFsbG93IHVzIHRvIGZvY3VzIG9uIG11bHRpY29saW5lYXJpdHkuCgoKVGhlcmVmb3JlIHdlIHdpbGwgdXNlIGEgc3Vic2V0IG9mIHRoZSBsaXN0ZWQgZXhwbGFuYXRvcnkgdmFyaWFibGVzIGFuZCB0aGV5IHdpbGwgYmUgY29uc2lzdGVudCBmb3IgYm90aCBhbmFseXNlcyB0aGF0IHdlIHdpbGwgcGVyZm9ybSwgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgb25lIGFuYWx5c2lzIHdpbGwgaGF2ZSA2IGRlbW9ncmFwaGljIHZhcmlhYmxlcyBsaWtlIHRoZSBhbmFseXNpcyBpbiB0aGUgW0Rvbm9odWUsIGV0IGFsLl0oaHR0cHM6Ly93d3cubmJlci5vcmcvcGFwZXJzL3cyMzUxMC5wZGYpe3RhcmdldD0iX2JsYW5rIn0gYXJ0aWNsZSBhbmQgdGhlIG90aGVyIHdpbGwgaGF2ZSAzNiBkZW1vZ3JwYWhpYyB2YXJpYWJsZXMgbGlrZSB0aGUgYW5hbHlzaXMgaW4gdGhlIFtMb3R0IGFuZCBNdXN0YXJkXShodHRwczovL2NoaWNhZ291bmJvdW5kLnVjaGljYWdvLmVkdS9jZ2kvdmlld2NvbnRlbnQuY2dpP2FydGljbGU9MTE1MCZjb250ZXh0PWxhd19hbmRfZWNvbm9taWNzKXt0YXJnZXQ9Il9ibGFuayJ9IGFydGljbGUuCgoKIyAqKk1haW4gUXVlc3Rpb24qKgoqKiogCgojIyMjIHsubWFpbl9xdWVzdGlvbl9ibG9ja30KPGI+PHU+IE91ciBtYWluIHF1ZXN0aW9uOiA8L3U+PC9iPgoKMSkgSG93IGRvZXMgdGhlIGluY2x1c2lvbiBvZiBkaWZmZXJlbnQgbnVtYmVycyBvZiBhZ2UgZ3JvdXBzIGluZmx1ZW5jZSB0aGUgcmVzdWx0cyBvZiBhbiBhbmFseXNpcyBvZiByaWdodCB0byBjYXJyeSBsYXdzIGFuZCB2aW9sZW5jZSByYXRlcz8KCiMjIyMKCgojICoqTGVhcm5pbmcgT2JqZWN0aXZlcyoqIAoqKiogCgo8dT4qKlN0YXRpc3RpY2FsIExlYXJuaW5nIE9iamVjdGl2ZXM6Kio8L3U+IAoKSW4gdGhpcyBjYXNlIHN0dWR5LCBzdHVkZW50cyB3aWxsIGxlYXJuOiAgCjEpIHdoYXQgbXVsdGljb2xpbmVhcml0eSBpcyBhbmQgaG93IGl0IGNhbiBpbmZsdWVuY2UgbGluZWFyIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzICAKMikgaG93IHRvIGxvb2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBtdWx0aWNvbGluYXJpdHkgIAozKSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG11bHRpY29saW5lYXJpdHkgYW5kIGNvcnJlbGF0aW9uICAKCjx1PioqRGF0YSBzY2llbmNlIExlYXJuaW5nIE9iamVjdGl2ZXM6Kio8L3U+CgoxKSBqb2luaW5nIGRhdGEgZnJvbSBtdWx0aXBsZSBzb3VyY2VzIChkcGx5cikgIAoyKSByZXNoYXBpbmcgZGF0YSBpbnRvIGRpZmZlcmVudCBmb3JtYXRzICh0aWR5cikgIAoyKSB2aXN1YWxpemF0aW9ucyAoZ2dwbG90MikgIAoKCldlIHdpbGwgZXNwZWNpYWxseSBmb2N1cyBvbiB1c2luZyBwYWNrYWdlcyBhbmQgZnVuY3Rpb25zIGZyb20gdGhlIFtgVGlkeXZlcnNlYF0oaHR0cHM6Ly93d3cudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0sIHN1Y2ggYXMgYGRwbHlyYCBhbmQgYGdncGxvdDJgLiBUaGUgdGlkeXZlcnNlIGlzIGEgbGlicmFyeSBvZiBwYWNrYWdlcyBjcmVhdGVkIGJ5IFJTdHVkaW8uIFdoaWxlIHNvbWUgc3R1ZGVudHMgbWF5IGJlIGZhbWlsaWFyIHdpdGggcHJldmlvdXMgUiBwcm9ncmFtbWluZyBwYWNrYWdlcywgdGhlc2UgcGFja2FnZXMgbWFrZSBkYXRhIHNjaWVuY2UgaW4gUiBlc3BlY2lhbGx5IGVmZmljaWVudC4KCgpgYGB7ciwgb3V0LndpZHRoID0gIjIwJSIsIGVjaG8gPSBGQUxTRSwgZmlnLmFsaWduID0iY2VudGVyIn0KaW5jbHVkZV9ncmFwaGljcygiaHR0cHM6Ly90aWR5dmVyc2UudGlkeXZlcnNlLm9yZy9sb2dvLnBuZyIpCmBgYAoKIyAqKkNvbnRleHQqKgoqKioKClNvIHdoYXQgZXhhY3RseSBpcyBhICoqcmlnaHQtdG8tY2FycnkgbGF3Kio/CgpJdCBpcyBhIGxhdyB0aGF0c3BlY2lmaWVzIGlmIGFuZCBob3cgY2l0aXplbnMgYXJlIGFsbG93ZWQgdG8gaGF2ZSBhIGZpcmVhcm0gb24gdGhlaXIgcGVyc29uIG9yIG5lYXJieSAoZm9yIGV4YW1wbGUgaW4gdGhlIGNpdGl6ZW4ncyBjYXIpIGluIHB1YmxpYy4gCgpUaGUgW1NlY29uZCBBbWVuZG1lbnRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NlY29uZF9BbWVuZG1lbnRfdG9fdGhlX1VuaXRlZF9TdGF0ZXNfQ29uc3RpdHV0aW9uKXt0YXJnZXQ9Il9ibGFuayJ9IHRvIHRoZSBVbml0ZWQgU3RhdGVzIENvbnN0aXR1dGlvbiBndWFyYW50ZWVzIHRoZSByaWdodCB0byAia2VlcCBhbmQgYmVhciBhcm1zIi4gVGhlIGFtZW5kbWVudCB3YXMgcmF0aWZpZWQgaW4gMTc5MSBhcyBwYXJ0IG9mIHRoZSBbQmlsbCBvZiBSaWdodHNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXRlZF9TdGF0ZXNfQmlsbF9vZl9SaWdodHMpe3RhcmdldD0iX2JsYW5rIn0uCgpgYGB7ciwgZWNobz1GQUxTRSwgb3V0LmhlaWdodCA9ICc1MCUnLCBvdXQud2lkdGggPSAnNTAlJywgZmlnLmFsaWduPSdjZW50ZXInfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy83Lzc5L0JpbGxfb2ZfUmlnaHRzX1BnMW9mMV9BQy5qcGciKQpgYGAKCkhvd2V2ZXIsIHRoZXJlIGFyZSBubyBmZWRlcmFsIGxhd3MgYWJvdXQgY2FycnlpbmcgZmlyZWFybXMgaW4gcHVibGljLiAKClRoZXNlIGxhd3MgYXJlIGNyZWF0ZWQgYW5kIGVuZm9yY2VkIGF0IHRoZSBzdGF0ZSBsZXZlbC4gU2F0ZXMgdmFyeSBncmVhdGx5IGluIHRoZWlyIGxhd3MgYWJvdXQgdGhlIHJpZ2h0IHRvIGNhcnJ5IGZpcmVhcm1zLiBTb21lIHJlcXVpcmUgZXh0ZW5zaXZlIGVmZm9ydCB0byBvYnRhaW4gYSBwZXJtaXQgdG8gbGVnYWxseSBjYXJyeSBhIGZpcmVhcm0sIHdoaWxlIG90aGVyIHN0YXRlcyByZXF1aXJlIHZlcnkgbWluaW1hbCBlZmZvcnQgdG8gbGVnYWxseSBjYXJyeSBhIGZpcmVhcm0uCgoKQWNjb3JkaW5nIHRvIFdpa2lwZWRpYSBhYm91dCB0aGUgaGlzdG9yeSBvZiByaWdodC10by1jYXJyeSBwb2xpY2llcyBpbiB0aGUgVW5pdGVkIFN0YXRlczoKCj4gUHVibGljIHBlcmNlcHRpb24gb24gY29uY2VhbGVkIGNhcnJ5IHZzIG9wZW4gY2FycnkgaGFzIGxhcmdlbHkgZmxpcHBlZC4gSW4gdGhlIGVhcmx5IGRheXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMsIG9wZW4gY2Fycnlpbmcgb2YgZmlyZWFybXMsIGxvbmcgZ3VucyBhbmQgcmV2b2x2ZXJzIHdhcyBhIGNvbW1vbiBhbmQgd2VsbC1hY2NlcHRlZCBwcmFjdGljZS4gU2VlaW5nIGd1bnMgY2FycmllZCBvcGVubHkgd2FzIG5vdCBjb25zaWRlcmVkIHRvIGJlIGFueSBjYXVzZSBmb3IgYWxhcm0uIFRoZXJlZm9yZSwgYW55b25lIHdobyB3b3VsZCBjYXJyeSBhIGZpcmVhcm0gYnV0IGF0dGVtcHQgdG8gY29uY2VhbCBpdCB3YXMgY29uc2lkZXJlZCB0byBoYXZlIHNvbWV0aGluZyB0byBoaWRlLCBhbmQgcHJlc3VtZWQgdG8gYmUgYSBjcmltaW5hbC4gRm9yIHRoaXMgcmVhc29uLCBjb25jZWFsZWQgY2Fycnkgd2FzIGRlbm91bmNlZCBhcyBhIGRldGVzdGFibGUgcHJhY3RpY2UgaW4gdGhlIGVhcmx5IGRheXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMuCgo+IENvbmNlYWxlZCB3ZWFwb25zIGJhbnMgd2VyZSBwYXNzZWQgaW4gS2VudHVja3kgYW5kIExvdWlzaWFuYSBpbiAxODEzLiAoSW4gdGhvc2UgZGF5cyBvcGVuIGNhcnJ5IG9mIHdlYXBvbnMgZm9yIHNlbGYtZGVmZW5zZSB3YXMgY29uc2lkZXJlZCBhY2NlcHRhYmxlOyBjb25jZWFsZWQgY2Fycnkgd2FzIGRlbm91bmNlZCBhcyB0aGUgcHJhY3RpY2Ugb2YgY3JpbWluYWxzLikgQnkgMTg1OSwgSW5kaWFuYSwgVGVubmVzc2VlLCBWaXJnaW5pYSwgQWxhYmFtYSwgYW5kIE9oaW8gaGFkIGZvbGxvd2VkIHN1aXQuIEJ5IHRoZSBlbmQgb2YgdGhlIG5pbmV0ZWVudGggY2VudHVyeSwgc2ltaWxhciBsYXdzIHdlcmUgcGFzc2VkIGluIHBsYWNlcyBzdWNoIGFzIFRleGFzLCBGbG9yaWRhLCBhbmQgT2tsYWhvbWEsIHdoaWNoIHByb3RlY3RlZCBzb21lIGd1biByaWdodHMgaW4gdGhlaXIgc3RhdGUgY29uc3RpdHV0aW9ucy4gQmVmb3JlIHRoZSBtaWQgMTkwMHMsIG1vc3QgVS5TLiBzdGF0ZXMgaGFkIHBhc3NlZCBjb25jZWFsZWQgY2FycnkgbGF3cyByYXRoZXIgdGhhbiBiYW5uaW5nIHdlYXBvbnMgY29tcGxldGVseS4gVW50aWwgdGhlIGxhdGUgMTk5MHMsIG1hbnkgU291dGhlcm4gc3RhdGVzIHdlcmUgZWl0aGVyICJOby1Jc3N1ZSIgb3IgIlJlc3RyaWN0aXZlIE1heS1Jc3N1ZSIuIFNpbmNlIHRoZW4sIHRoZXNlIHN0YXRlcyBoYXZlIGxhcmdlbHkgZW5hY3RlZCAiU2hhbGwtSXNzdWUiIGxpY2Vuc2luZyBsYXdzLCB3aXRoIG51bWVyb3VzIHN0YXRlcyBsZWdhbGl6aW5nICJVbnJlc3RyaWN0ZWQgY29uY2VhbGVkIGNhcnJ5Ii4KClNlZSBbaGVyZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGlzdG9yeV9vZl9jb25jZWFsZWRfY2FycnlfaW5fdGhlX1UuUy4pe3RhcmdldD0iX2JsYW5rIn0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCgpIZXJlIGFyZSB0aGUgZ2VuZXJhbCBjYXRlZ29yaWVzIG9mIFJpZ2h0IHRvIENhcnJ5IExhd3M6CgpgYGB7ciwgZWNobz1GQUxTRSwgb3V0LmhlaWdodCA9ICcxMDAlJywgb3V0LndpZHRoID0gJzEwMCUnLCBmaWcuYWxpZ249J2NlbnRlcid9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmUoImltZyIsICJSVEMucG5nIikpCmBgYApbc291cmNlXShodHRwczovL3d3dy5ucmFpbGEub3JnL2d1bi1sYXdzLyl7dGFyZ2V0PSJfYmxhbmsifQoKCmBgYHtyLCBlY2hvPUZBTFNFLCBvdXQuaGVpZ2h0ID0gJzEwMCUnLCBvdXQud2lkdGggPSAnMTAwJScsIGZpZy5hbGlnbj0nY2VudGVyJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZSgiaW1nIiwgIlJUQ19tYXAucG5nIikpCmBgYAoKW3NvdXJjZV0oaHR0cHM6Ly93d3cubnJhaWxhLm9yZy9ndW4tbGF3cy8pe3RhcmdldD0iX2JsYW5rIn0KCllvdSBjYW4gc2VlIHRoYXQgbm9uZSBvZiB0aGUgZmlmdHkgc3RhdGVzIGhhdmUgbm8taXNzdWUgbGF3cyBjdXJyZW50bHksIG1lYW5pbmcgdGhhdCBhbGwgc3RhdGVzIGFsbG93IHRoZSByaWdodCB0byBjYXJyeSBmaXJlYXJtcyBhdCBsZWFzdCBpbiBzb21lIHdheSwgaG93ZXZlciB0aGUgbGV2ZWwgb2YgcmVzdHJpY3Rpb25zIGlzIGRyYW1hdGljYWxseSBkaWZmZXJlbnQgZnJvbSBvbmUgc3RhdGUgdG8gYW5vdGhlci4KCkhlcmUgeW91IGNhbiBzZWUgaG93IHRoZXNlIGxhd3MgaGF2ZSBjaGFuZ2VkIG92ZXIgdGltZSBhcm91bmQgdGhlIGNvdW50cnk6CmBgYHtyLCBlY2hvPUZBTFNFLCBvdXQuaGVpZ2h0ID0gJzEwMCUnLCBvdXQud2lkdGggPSAnMTAwJScsIGZpZy5hbGlnbj0nY2VudGVyJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvNS81YS9SaWdodF90b19DYXJyeSUyQ190aW1lbGluZS5naWYvNjIwcHgtUmlnaHRfdG9fQ2FycnklMkNfdGltZWxpbmUuZ2lmIikKYGBgCgpUaGVyZSBpcyB2YXJpYXRpb24gZnJvbSBzdGF0ZSB0byBzdGF0ZSBldmVuIHdpdGhpbiB0aGUgc2FtZSBnZW5lcmFsIGNhdGVnb3J5OgoKRm9yIGV4YW1wbGUgaGVyZSBhcmUgdGhlIFtjdXJyZW50IGNhcnJ5IGxhd3MgaW4gSWRhaG9dKGh0dHBzOi8vd3d3Lm5yYWlsYS5vcmcvZ3VuLWxhd3Mvc3RhdGUtZ3VuLWxhd3MvaWRhaG8vKSB3aGljaCBpcyBjb25zaWRlcmVkIGFuICJVbnJlc3RyaWN0ZWQgLSBubyBwZXJtaXQgcmVxdWlyZWQiIHN0YXRlOgoKPklkYWhvIHBlcm1pdHMgdGhlIG9wZW4gY2Fycnlpbmcgb2YgZmlyZWFybXMuCgo+SWRhaG8gbGF3IHBlcm1pdHMgYm90aCByZXNpZGVudHMgYW5kIG5vbi1yZXNpZGVudHMgd2hvIGFyZSBhdCBsZWFzdCAxOCB5ZWFycyBvbGQgdG8gY2FycnkgY29uY2VhbGVkIHdlYXBvbnMsIHdpdGhvdXQgYSBjYXJyeSBsaWNlbnNlLCBvdXRzaWRlIHRoZSBsaW1pdHMgb2Ygb3IgY29uZmluZXMgb2YgYW55IGNpdHksIHByb3ZpZGVkIHRoZSBwZXJzb24gaXMgbm90IG90aGVyd2lzZSBkaXNxdWFsaWZpZWQgZnJvbSBiZWluZyBpc3N1ZWQgYSBsaWNlbnNlIHRvIGNhcnJ5LgoKPkEgcGVyc29uIG1heSBhbHNvIGNhcnJ5IGNvbmNlYWxlZCB3ZWFwb25zIG9uIG9yIGFib3V0IGhpcyBvciBoZXIgcGVyc29uLCB3aXRob3V0IGEgbGljZW5zZSwgaW4gdGhlIHBlcnNvbuKAmXMgb3duIHBsYWNlIG9mIGFib2RlIG9yIGZpeGVkIHBsYWNlIG9mIGJ1c2luZXNzLCBvbiBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgcGVyc29uIGhhcyBhbnkgb3duZXJzaGlwIG9yIGxlYXNlaG9sZCBpbnRlcmVzdCwgb3Igb24gcHJpdmF0ZSBwcm9wZXJ0eSB3aGVyZSB0aGUgcGVyc29uIGhhcyBwZXJtaXNzaW9uIHRvIGNhcnJ5IGZyb20gYW55IHBlcnNvbiB3aG8gaGFzIGFuIG93bmVyc2hpcCBvciBsZWFzZWhvbGQgaW50ZXJlc3QgaW4gdGhhdCBwcm9wZXJ0eS4gCgo+U3RhdGUgbGF3IGFsc28gYWxsb3dzIGFueSByZXNpZGVudCBvZiBJZGFobyBvciBhIGN1cnJlbnQgbWVtYmVyIG9mIHRoZSBhcm1lZCBmb3JjZXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgdG8gY2FycnkgYSBjb25jZWFsZWQgaGFuZGd1biB3aXRob3V0IGEgbGljZW5zZSB0byBjYXJyeSwgcHJvdmlkZWQgdGhlIHBlcnNvbiBpcyBvdmVyIDE4IHllYXJzIG9sZCBhbmQgbm90IGRpc3F1YWxpZmllZCBmcm9tIGJlaW5nIGlzc3VlZCBhIGxpY2Vuc2UgdG8gY2FycnkgY29uY2VhbGVkIHdlYXBvbnMgdW5kZXIgc3RhdGUgbGF3LiBBbiBhbWVuZG1lbnQgdG8gc3RhdGUgbGF3IHRoYXQgdGFrZXMgZWZmZWN0IG9uIEp1bHkgMSwgMjAyMCBjaGFuZ2VzIHRoZSByZWZlcmVuY2UgaW4gdGhlIGFib3ZlIGxhdyBmcm9tIOKAnGEgcmVzaWRlbnQgb2YgSWRhaG/igJ0gdG8g4oCcYW55IGNpdGl6ZW4gb2YgdGhlIFVuaXRlZCBTdGF0ZXMu4oCdICAKCgpBbmQgaGVyZSBhcmUgdGhlIFtjdXJyZW50IGNhcnJ5IGxhd3MgaW4gQXJpem9uYV0oaHR0cHM6Ly93d3cubnJhaWxhLm9yZy9ndW4tbGF3cy9zdGF0ZS1ndW4tbGF3cy9hcml6b25hLykgd2hpY2ggaXMgYWxzbyBjb25zaWRlcmVkIGFuICJVbnJlc3RyaWN0ZWQtIC0gbm8gcGVybWl0IHJlcXVpcmVkIiBzdGF0ZToKCj4gQXJpem9uYSByZXNwZWN0cyB0aGUgcmlnaHQgb2YgbGF3IGFiaWRpbmcgY2l0aXplbnMgdG8gb3Blbmx5IGNhcnJ5IGEgaGFuZGd1bi4KCj4gQW55IHBlcnNvbiAyMSB5ZWFycyBvZiBhZ2Ugb3Igb2xkZXIsIHdobyBpcyBub3QgcHJvaGliaXRlZCBwb3NzZXNzb3IsIG1heSBjYXJyeSBhIHdlYXBvbiBvcGVubHkgb3IgY29uY2VhbGVkIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGEgbGljZW5zZS4gQW55IHBlcnNvbiBjYXJyeWluZyB3aXRob3V0IGEgbGljZW5zZSBtdXN0IGFja25vd2xlZGdlIGFuZCBjb21wbHkgd2l0aCB0aGUgZGVtYW5kcyBvZiBhIGxhdyBlbmZvcmNlbWVudCBvZmZpY2VyIHdoZW4gYXNrZWQgaWYgaGUvc2hlIGlzIGNhcnJ5aW5nIGEgY29uY2VhbGVkIGRlYWRseSB3ZWFwb24sIGlmIHRoZSBvZmZpY2VyIGhhcyBpbml0aWF0ZWQgYW4gImludmVzdGlnYXRpb24iIHN1Y2ggYXMgYSB0cmFmZmljIHN0b3AuCgpOb3RpY2UgdGhhdCBjaXRpemVucyBpbiBJZGFobyBvbmx5IG5lZWQgdG8gYmUgMTggdG8gY2FycnkgYSBmaXJlYXJtLCB3aGVyZWFzIHRoZXkgbXVzdCBiZSAyMSBpbiBBcml6b25hLiAKCgpJbiBjb250cmFzdCBoZXJlIGlzIGFuIGV4YW1wbGUgb2YgW2N1cnJlbnQgY2FycnkgbGF3cyBpbiBNYXJ5bGFuZF0oaHR0cHM6Ly93d3cubnJhaWxhLm9yZy9ndW4tbGF3cy9zdGF0ZS1ndW4tbGF3cy9tYXJ5bGFuZC8pIHdoaWNoIGlzIGNvbnNpZGVyZWQgYSAiUmlnaHRzIFJlc3RyaWN0ZWQtVmVyeSBMaW1pdGVkIElzc3VlIiBzdGF0ZToKCj5DYXJyeWluZyBhbmQgVHJhbnNwb3J0YXRpb24gaW4gVmVoaWNsZXMKSXQgaXMgdW5sYXdmdWwgZm9yIGFueSBwZXJzb24gd2l0aG91dCBhIHBlcm1pdCB0byB3ZWFyIG9yIGNhcnJ5IGEgaGFuZGd1biwgb3Blbmx5IG9yIGNvbmNlYWxlZCwgdXBvbiBvciBhYm91dCBoaXMgcGVyc29uLiAgSXQgaXMgYWxzbyB1bmxhd2Z1bCBmb3IgYW55IHBlcnNvbiB0byBrbm93aW5nbHkgdHJhbnNwb3J0IGEgaGFuZGd1biBpbiBhbnkgdmVoaWNsZSB0cmF2ZWxpbmcgb24gcHVibGljIHJvYWRzLCBoaWdod2F5cywgd2F0ZXJ3YXlzIG9yIGFpcndheXMsIG9yIHVwb24gcm9hZHMgb3IgcGFya2luZyBsb3RzIGdlbmVyYWxseSB1c2VkIGJ5IHRoZSBwdWJsaWMuIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gYW55IHBlcnNvbiB3ZWFyaW5nLCBjYXJyeWluZyBvciB0cmFuc3BvcnRpbmcgYSBoYW5kZ3VuIHdpdGhpbiB0aGUgY29uZmluZXMgb2YgcmVhbCBlc3RhdGUgb3duZWQgb3IgbGVhc2VkIGJ5IGhpbSwgb3Igb24gd2hpY2ggaGUgcmVzaWRlcywgb3Igd2l0aGluIHRoZSBjb25maW5lcyBvZiBhIGJ1c2luZXNzIGVzdGFibGlzaG1lbnQgb3duZWQgb3IgbGVhc2VkIGJ5IGhpbS4KCj5QZXJtaXQgVG8gQ2FycnkKQXBwbGljYXRpb24gZm9yIGEgcGVybWl0IHRvIGNhcnJ5IGEgaGFuZGd1biBpcyBtYWRlIHRvIHRoZSBTZWNyZXRhcnkgb2YgU3RhdGUgUG9saWNlLiAgSW4gYWRkaXRpb24gdG8gdGhlIHByaW50ZWQgYXBwbGljYXRpb24gZm9ybSwgdGhlIGFwcGxpY2FudCBzaG91bGQgc3VibWl0IGEgbm90YXJpemVkIGxldHRlciBzdGF0aW5nIHRoZSByZWFzb25zIHdoeSBoZSBpcyBhcHBseWluZyBmb3IgYSBwZXJtaXQuCgoKYXZvY2Fkby4uLi5SaWdodCB0byBjYXJyeSBhbmQgY292aWQgbWFza3M/CgojICoqTGltaXRhdGlvbnMqKgoqKiogClRoZXJlIGFyZSBzb21lIGltcG9ydGFudCBjb25zaWRlcmF0aW9ucyByZWdhcmRpbmcgdGhpcyBkYXRhIGFuYWx5c2lzIHRvIGtlZXAgaW4gbWluZDogCgoxKSBXZSBkbyBub3QgdXNlIGFsbCBvZiB0aGUgZGF0YSB1c2VkIGJ5IGVpdGhlciB0aGUgIFtMb3R0IGFuZCBNdXN0YXJkXShodHRwczovL2NoaWNhZ291bmJvdW5kLnVjaGljYWdvLmVkdS9jZ2kvdmlld2NvbnRlbnQuY2dpP2FydGljbGU9MTE1MCZjb250ZXh0PWxhd19hbmRfZWNvbm9taWNzKXt0YXJnZXQ9Il9ibGFuayJ9IG9yIFtEb25vaHVlLCBldCBhbC5dKGh0dHBzOi8vd3d3Lm5iZXIub3JnL3BhcGVycy93MjM1MTAucGRmKXt0YXJnZXQ9Il9ibGFuayJ9IGFuYWx5c2VzLCBub3IgZG8gd2UgcGVyZm9ybSB0aGUgc2FtZSBhbmFseXNpcyBvZiBlYWNoIGFydGljbGUuIFdlIGluc3RlYWQgcGVyZm9ybSBhIG11Y2ggc2ltcGxlciBhbmFseXNpcyB3aXRoIGxlc3MgdmFyaWFibGVzIGZvciB0aGUgcHVycG9zZXMgb2YgaWxsdXN0cmF0aW9uIG9mIHRoZSBjb25jZXB0IG9mIG11bHRpY29sbGluZWFyaXR5IGFuZCBpdHMgaW5mbHVlbmNlIG9uIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzLCBub3QgdG8gcmVwcm9kdWNlIGVpdGhlciBhbmFseXNpcy4KCjIpIEJlY2F1c2Ugb3VyIGFuYWx5c2lzIGlzIGFuIG92ZXJzaW1wbGlmaWNhdGlvbiwgb3VyIGFuYWx5c2lzIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgcG9saWN5IGNoYW5nZXMsIGluc3RlYWQgd2Ugc3VnZ2VzdCB0aGF0IHVzZXJzIGNvbnN1bHQgd2l0aCBhIHNwZWNpYWxpc3QuCgoKV2Ugd291bGQgYWxzbyBsaWtlIHRvIG5vdGUgdGhhdC4uLkFWT0NBRE8KSXQgaXMgaW1wb3J0YW50IHRoYXQgd2UgZG8gbm90IHRyZWF0IHJhY2UgYXMgYW4gb2JqZWN0aXZlIG1lYXN1cmUuIERlc3BpdGUgdGhpcywgaXQgY2FuIGJlIHVzZWQgdG8gYWR2YW5jZSBzY2llbnRpZmljIGlucXVpcnkuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgdG9waWMsIHdlIGhhdmUgaW5jbHVkZWQgYSBsaW5rIHRvIGEgW3BhcGVyIG9uIHRoZSB1c2Ugb2YgcmFjZSBhcyBhIG1lYXN1cmUgaW4gZXBpZGVtaW9sb2d5XShodHRwczovL2FjYWRlbWljLm91cC5jb20vZXBpcmV2L2FydGljbGUvMjIvMi8xODcvNDU2OTQyKS4gCgoKV2Ugd2lsbCBiZWdpbiBieSBsb2FkaW5nIHRoZSBwYWNrYWdlcyB0aGF0IHdlIHdpbGwgbmVlZDoKCmBgYHtyfQpsaWJyYXJ5KGhlcmUpIApsaWJyYXJ5KGNhcikgIyB2aWYgZnVuY3Rpb24KbGlicmFyeShwbG0pICMgZml4ZWQgZWZmZWN0IG1vZGVsLCBsaW5lYXIgcmVncmVzc2lvbgpsaWJyYXJ5KGJyb29tKSAjIHRpZHkgb3V0cHV0CmxpYnJhcnkodGlkeXZlcnNlKSAjIGdlbmVyYWwgd3JhbmdsaW5nIGZ1bmN0aW9ucwpsaWJyYXJ5KHBkZnRvb2xzKSAjIHJlYWQgZGF0YSBmcm9tIHBkZiAKbGlicmFyeShyZWFkeGwpICMgaW1wb3J0aW5nIGV4Y2VsIHNoZWV0cwpsaWJyYXJ5KGNvd3Bsb3QpICMgdG8gcHJvZHVjZSBwbG90IG9mIHBsb3RzIApsaWJyYXJ5KEdHYWxseSkKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShsYXRleDJleHApCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShnZ2NvcnJwbG90KQpsaWJyYXJ5KHJzYW1wbGUpCgpzZXQuc2VlZCg5OTkpCmBgYAoKCiBQYWNrYWdlICAgfCBVc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS0KW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9qZW5ueWJjL2hlcmVfaGVyZSl7dGFyZ2V0PSJfYmxhbmsifSAgICAgICB8IHRvIGVhc2lseSBsb2FkIGFuZCBzYXZlIGRhdGEKW3JlYWRyXShodHRwczovL3JlYWRyLnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICAgfCB0byBpbXBvcnQgdGhlIENTViBmaWxlIGRhdGEKW2Nhcl0gIHwgdG8gY2FsY3VsYXRlIHZpZiB2YWx1ZXMKClRoZSBmaXJzdCB0aW1lIHdlIHVzZSBhIGZ1bmN0aW9uLCB3ZSB3aWxsIHVzZSB0aGUgYDo6YCB0byBpbmRpY2F0ZSB3aGljaCBwYWNrYWdlIHdlIGFyZSB1c2luZy4gVW5sZXNzIHdlIGhhdmUgb3ZlcmxhcHBpbmcgZnVuY3Rpb24gbmFtZXMsIHRoaXMgaXMgbm90IG5lY2Vzc2FyeSwgYnV0IHdlIHdpbGwgaW5jbHVkZSBpdCBoZXJlIHRvIGJlIGluZm9ybWF0aXZlIGFib3V0IHdoZXJlIHRoZSBmdW5jdGlvbnMgd2Ugd2lsbCB1c2UgY29tZSBmcm9tLgoKCiMgKipXaGF0IGFyZSB0aGUgZGF0YT8qKgoqKioKCkJlbG93IGlzIGEgdGFibGUgZnJvbSB0aGUgW0Rvbm9odWUsIGV0IGFsLl0oaHR0cHM6Ly93d3cubmJlci5vcmcvcGFwZXJzL3cyMzUxMC5wZGYpIHBhcGVyIHRoYXQgc2hvd3MgdGhlIGRhdGEgdXNlZCBpbiBib3RoIGFuYWx5c2VzLCB3aGVyZSBEQVcgc3RhbmRzIGZvciBbRG9ub2h1ZSwgZXQgYWwuXShodHRwczovL3d3dy5uYmVyLm9yZy9wYXBlcnMvdzIzNTEwLnBkZil7dGFyZ2V0PSJfYmxhbmsifSBhbmQgTE0gc3RhbmRzIGZvciBbTG90dCBhbmQgTXVzdGFyZF0oaHR0cHM6Ly9jaGljYWdvdW5ib3VuZC51Y2hpY2Fnby5lZHUvY2dpL3ZpZXdjb250ZW50LmNnaT9hcnRpY2xlPTExNTAmY29udGV4dD1sYXdfYW5kX2Vjb25vbWljcyl7dGFyZ2V0PSJfYmxhbmsifS4KCgpgYGB7ciwgZWNobz1GQUxTRSwgb3V0LmhlaWdodCA9ICcxMDAlJywgb3V0LndpZHRoID0gJzEwMCUnLCBmaWcuYWxpZ249J2NlbnRlcid9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmUoImltZyIsICJEb25vaHVlX0FwcGVuZGl4Si5wbmciKSkKYGBgCgpXZSB3aWxsIGJlIHVzaW5nIGEgc3Vic2V0IG9mIHRoZXNlIHZhcmlhYmxlcywgd2hpY2ggYXJlIGhpZ2hsaWdodGVkIGluIGdyZWVuOgoKCmBgYHtyLCBlY2hvPUZBTFNFLCBvdXQuaGVpZ2h0ID0gJzEwMCUnLCBvdXQud2lkdGggPSAnMTAwJScsIGZpZy5hbGlnbj0nY2VudGVyJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZSgiaW1nIiwgIm91cmRhdGEucG5nIikpCmBgYAoKCiMgKipEYXRhIEltcG9ydCoqCioqKgoKIyNTdGF0ZSBGSVBTIGNvZGVzCkF2b2NhZG8gd2h5IGRvIHdlIG5lZWQgU3RhdGUgRklQUz8KClRoZSBmb2xsb3dpbmcgZGF0YSB3YXMgZG93bmxvYWRlZCBmcm9tIHRoZSBbVVMgQ2Vuc3VzIEJ1cmVhdV0oaHR0cHM6Ly93d3cuY2Vuc3VzLmdvdi9nZW9ncmFwaGllcy9yZWZlcmVuY2UtZmlsZXMvMjAxNC9kZW1vL3BvcGVzdC8yMDE0LWdlb2NvZGVzLXN0YXRlLmh0bWwpLgoKVG8gaW1wb3J0IHRoZSBkYXRhIHdlIHdpbGwgdXNlIHRoZSBgcmVhZF94bHMoKWAgZnVuY3Rpb24gb2YgdGhlIGByZWFkeGxgIHBhY2thZ2UuIFNpbmNlIHRoZSBmaXJzdCBmaXZlIGxpbmVzIG9mIHRoaXMgZXhjZWwgaXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNvdXJjZSBvZiB0aGUgZGF0YSBhbmQgd2hlbiBpdCB3YXMgcmVsZWFzZWQsIHdlIG5lZWQgdG8gc2tpcCBpbXBvcnRpbmcgdGhlc2UgbGluZXMgdXNpbmcgdGhlIGBza2lwYCBhcmd1bWVudCBzbyB0aGF0IHRoZSBkYXRhIGhhcyB0aGUgc2FtZSBudW1iZXIgb2YgY29sdW1ucyBmb3IgZWFjaCByb3cuIAoKYGBge3J9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmUoImltZyIsICJGSVBTLnBuZyIpKQoKYGBgCgpgYGB7cn0KU1RBVEVfRklQUyA8LSByZWFkX3hscygiZG9jcy9TdGF0ZV9GSVBTX2NvZGVzL3N0YXRlLWdlb2NvZGVzLXYyMDE0LnhscyIsIHNraXAgPSA1KQpgYGAKCiMjIERlbW9ncmFwaGljIGFuZCBQb3B1bGF0aW9uIGRhdGEKClRvIG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCBhZ2UsIHNleCwgYW5kIHJhY2UsIGFuZCBvdmVyYWxsIHBvcHVsYXRpb24gd2Ugd2lsbCB1c2UgVVMgQ2Vuc3VzIEJ1cmVhdSBkYXRhLCBqdXN0IGxpa2UgYm90aCBvZiB0aGUgYXJ0aWNsZXMuIFRoZSBjZXNudXMgZGF0YSBpcyBhdmFpbGFibGUgZm9yIGRpZmZlcmVudCB0aW1lIHNwYW5zLiBIZXJlIGFyZSB0aGUgbGlua3MgZm9yIHRoZSB5ZWFycyB1c2VkIGluIG91ciBhbmFseXNpcy4gV2Ugd2lsbCB1c2UgZGF0YSBmcm9tIDE5NzcgdG8gMjAxMC4KCkRhdGEgICB8IExpbmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLQoqKnllYXJzIDE5NzcgdG8gMTk3OSoqICB8IFtsaW5rXShodHRwczovL3d3dzIuY2Vuc3VzLmdvdi9wcm9ncmFtcy1zdXJ2ZXlzL3BvcGVzdC90YWJsZXMvMTkwMC0xOTgwL3N0YXRlL2FzcmgvKSAgCioqeWVhcnMgMTk4MCB0byAxOTg5KiogIHwgW2xpbmtdKGh0dHBzOi8vd3d3Mi5jZW5zdXMuZ292L3Byb2dyYW1zLXN1cnZleXMvcG9wZXN0L3RhYmxlcy8xOTgwLTE5OTAvY291bnRpZXMvYXNyaC8pICogY291bnR5IGRhdGEgd2FzIHVzZWQgZm9yIHRoaXMgZGVjYWRlCioqeWVhcnMgMTk5MCB0byAxOTk5KiogIHwgW2xpbmtdKGh0dHBzOi8vd3d3Mi5jZW5zdXMuZ292L3Byb2dyYW1zLXN1cnZleXMvcG9wZXN0L3RhYmxlcy8xOTkwLTIwMDAvc3RhdGUvYXNyaC8pCioqeWVhcnMgMjAwMCB0byAyMDEwKiogIHwgW2xpbmtdKGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvZGF0YS9kYXRhc2V0cy90aW1lLXNlcmllcy9kZW1vL3BvcGVzdC9pbnRlcmNlbnNhbC0yMDAwLTIwMTAtc3RhdGUuaHRtbCkgPGJyPiBbdGVjaG5pY2FsIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3Mi5jZW5zdXMuZ292L3Byb2dyYW1zLXN1cnZleXMvcG9wZXN0L3RlY2huaWNhbC1kb2N1bWVudGF0aW9uL2ZpbGUtbGF5b3V0cy8yMDAwLTIwMTAvaW50ZXJjZW5zYWwvc3RhdGUvc3QtZXN0MDBpbnQtYWxsZGF0YS5wZGYpCgpUbyBpbXBvcnQgdGhlIGRhdGEgd2Ugd2lsbCB1c2UgdGhlIGByZWFkX2NzdigpYCBmdW5jdGlvbiBvZiB0aGUgYHJlYWRyYCBwYWNrYWdlIGZvciB0aGUgY3N2IGZpbGVzLiBJbiBzb21lIGRlY2FkZXMsIHRoZXJlIGFyZSBzZXBhcmF0ZSBmaWxlcyBmb3IgZWFjaCB5ZWFyLCB3ZSB3aWxsIHJlYWQgZWFjaCBvZiB0aGVzZSB0b2dldGhlciB1c2luZyB0aGUgYmFzZSBgbGlzdC5maWxlcygpYCBmdW5jdGlvbiB0byBnZXQgYWxsIG9mIHRoZSBuYW1lcyBmb3IgZWFjaCBmaWxlIGFuZCB0aGVuIHRoZSBgbWFwKClgIGZ1bmN0aW9uIG9mIHRoZSBgcHVycnJgIHBhY2thZ2UgdG8gYXBwbHkgdGhlIGByZWFkX2NzdigpYCBmdW5jdGlvbiBvbiBhbGwgb2YgdGhlIGZpbGUgcGF0aHMgaW4gdGhlIGxpc3QgY3JlYXRlZCBieSBgbGlzdC5maWxlcygpYC4gRm9yIHllYXJzIHRoYXQgYXJlIHR4dCBmaWxlcyB3ZSB3aWxsIHVzZSBgcmVhZF90YWJsZTIoKWAgYWxzbyBmbyB0aGUgYHJlYWRyYCBwYWNrYWdlLiBUaGUgYHJlYWRfdGFibGUyKClgIGZ1bmN0aW9uLCB1bmxpa2UgdGhlIGByZWFkX3RhYmxlKClgLCAgYWxsb3dzIGZvciBhbnkgbnVtYmVyIG9mIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBiZXR3ZWVuIGNvbHVtbnMsIGFuZCB0aGUgbGluZXMgY2FuIGJlIG9mIGRpZmZlcmVudCBsZW5ndGhzLgoKQVZPQ0FETyBJIGFtIGEgYml0IGNvbmZ1c2VkIGFib3V0IHRoZSBsYXN0IGRlY2FkZS4uLiBpdCdzIG9ubHkgb25lIGZpbGUgYnV0IGl0IHNlZW1zIHRvIG5lZWQgbWFwLi4uCgpgYGB7cn0KCmRlbV83N183OSA8LSByZWFkX2NzdigiZG9jcy9EZW1vZ3JhcGhpY3MvRGVjYWRlXzE5NzAvcGUtMTkuY3N2Iiwgc2tpcCA9IDUpCgpkZW1fODBfODkgPC0gbGlzdC5maWxlcyhyZWN1cnNpdmUgPSBUUlVFLAogICAgICAgICAgICAgICAgICBwYXRoID0gImRvY3MvRGVtb2dyYXBoaWNzL0RlY2FkZV8xOTgwLyIsCiAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiKi5jc3YiLAogICAgICAgICAgICAgICAgICBmdWxsLm5hbWVzID0gVFJVRSkgJT4lIAogIG1hcCh+cmVhZF9jc3YoLiwgc2tpcD01KSkKCmRlbV85MF85OSA8LSBsaXN0LmZpbGVzKHJlY3Vyc2l2ZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgIHBhdGggPSAiZG9jcy9EZW1vZ3JhcGhpY3MvRGVjYWRlXzE5OTAvIiwKICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICIqLnR4dCIsCiAgICAgICAgICAgICAgICAgIGZ1bGwubmFtZXMgPSBUUlVFKSAlPiUgCiAgbWFwKH5yZWFkX3RhYmxlMiguLCBza2lwID0gMTQpKQoKCmRlbV85MF85OSA8LSBkZW1fOTBfOTkgJT4lCiAgbWFwX2RmKGJpbmRfcm93cykKCgpkZW1fMDBfMTBfMiA8LSByZWFkX2NzdigiZG9jcy9EZW1vZ3JhcGhpY3MvRGVjYWRlXzIwMDAvc3QtZXN0MDBpbnQtYWxsZGF0YS5jc3YiKQoKZGVtXzAwXzEwIDwtIGxpc3QuZmlsZXMocmVjdXJzaXZlID0gVFJVRSwKICAgICAgICAgICAgICAgICAgcGF0aCA9ICJkb2NzL0RlbW9ncmFwaGljcy9EZWNhZGVfMjAwMC8iLAogICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIiouY3N2IiwKICAgICAgICAgICAgICAgICAgIGZ1bGwubmFtZXMgPSBUUlVFKSAlPiUgCiAgIG1hcCh+cmVhZF9jc3YoLikpCgoKYGBgCgojIyBQb2xpY2Ugc3RhZmZpbmcgZGF0YQpUaGUgZm9sbG93aW5nIGRhdGEgd2FzIGRvd25sb2FkZWQgZnJvbSB0aGUgW0ZlZGVyYWwgQnVyZWF1IG9mIEludmVzdGlnYXRpb25dKGh0dHBzOi8vY3JpbWUtZGF0YS1leHBsb3Jlci5mci5jbG91ZC5nb3YvZG93bmxvYWRzLWFuZC1kb2NzKS4gCgoKVGhlIGByZWFkX2NzdigpYCBmdW5jdGlvbiBvZiB0aGUgYHJlYWRyYCBwYWNrYWdlIGd1ZXNzZXMgd2hhdCB0aGUgY2xhc3MgaXMgZm9yIGVhY2ggdmFyaWFibGUsIGJ1dCBzb21ldGltZXMgaXQgbWFrZXMgbWlzdGFrZXMuIEl0IGlzIGdvb2QgdG8gc3BlY2lmeSB0aGUgY2xhc3MgZm9yIHZhcmlhYmxlcyBpZiB5b3Uga25vdyB0aGVtLiBXZSBrbm93IHRoYXQgd2Ugd2FudCB0aGUgdmFyaWFibGVzIGFib3V0IG1hbGUgYW5kIGZlbWFsZSBjb3VudHMgdG8gYmUgbnVtYmVyaWMuIFdlIGNhbiBzcGVjaWZ5IHRoYXQgdXNpbmcgdGhlIGBjb2xfdHlwZXMgPWAgYXJndW1lbnQuIFNlZSBbaGVyZV0oaHR0cHM6Ly9yZWFkci50aWR5dmVyc2Uub3JnL2FydGljbGVzL3JlYWRyLmh0bWwpIGFuZCBbaGVyZV0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3JlYWRyL3ZpZ25ldHRlcy9yZWFkci5odG1sKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gT25lCgpgYGB7cn0KcHNfZGF0YSA8LSByZWFkX2NzdigiZG9jcy9Qb2xpY2Vfc3RhZmZpbmcvcGVfMTk2MF8yMDE4LmNzdiIpCnBzX2RhdGEgPC0gcmVhZF9jc3YoImRvY3MvUG9saWNlX3N0YWZmaW5nL3BlXzE5NjBfMjAxOC5jc3YiLAogICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGNvbHMobWFsZV90b3RhbF9jdCA9ICJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbWFsZV90b3RhbF9jdCA9ICJuIikpCgpwc19kYXRhIDwtIHJlYWRfY3N2KCJkb2NzL1BvbGljZV9zdGFmZmluZy9wZV8xOTYwXzIwMTguY3N2IiwKICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9ICBjb2xzKG1hbGVfdG90YWxfY3QgPSBjb2xfZG91YmxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVtYWxlX3RvdGFsX2N0ID0gY29sX2RvdWJsZSgpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmBgYAoKCgojIyBVbmVtcGx5bWVudCBkYXRhCmh0dHBzOi8vZGF0YS5ibHMuZ292L2NnaS1iaW4vZHNydj9sYQpgYGB7cn0KCnVlX3JhdGVfZGF0YSA8LSBsaXN0LmZpbGVzKHJlY3Vyc2l2ZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgIHBhdGggPSAiZG9jcy9VbmVtcGxveW1lbnQiLAogICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIioueGxzeCIsCiAgICAgICAgICAgICAgICAgIGZ1bGwubmFtZXMgPSBUUlVFKSAlPiUgCiAgbWFwKH5yZWFkX3hsc3goLiwgc2tpcCA9IDEwKSkKCnVlX3JhdGVfbmFtZXMgPC0gbGlzdC5maWxlcyhyZWN1cnNpdmUgPSBUUlVFLAogICAgICAgICAgICAgICAgICBwYXRoID0gImRvY3MvVW5lbXBsb3ltZW50IiwKICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICIqLnhsc3giLAogICAgICAgICAgICAgICAgICBmdWxsLm5hbWVzID0gVFJVRSkgJT4lCiAgbWFwKH5yZWFkX3hsc3goLikpICU+JQogIHNhcHBseSguLCAiWyIsNywyLCBkcm9wPVRSVUUpCmBgYAojIyBQb3ZlcnR5IGRhdGEKCmBgYHtyfQojRXh0cmFjdGVkIGZyb20gVGFibGUgMjEgZnJvbSBbVVMgQ2Vuc3VzIEJ1cmVhdV0oaHR0cHM6Ly93d3cuY2Vuc3VzLmdvdi9kYXRhL3RhYmxlcy90aW1lLXNlcmllcy9kZW1vL2luY29tZS1wb3ZlcnR5L2hpc3RvcmljYWwtcG92ZXJ0eS1wZW9wbGUuaHRtbCkKCiMqKnBlcnNpc3RlbnQgd2FybmluZyBmcm9tIHVua25vd24gb3JpZ2luKiogaHR0cHM6Ly9jb21tdW5pdHkucnN0dWRpby5jb20vdC9wZXJzaXN0ZW50LXVua25vd24tb3ItdW5pbml0aWFsaXNlZC1jb2x1bW4td2FybmluZ3MvNjQ4NzkKCiNzb2x1dGlvbiB0byBhYm92ZSBpcyBhbGxlZGdlZGx5OiAiSW4gYW55IGNhc2UgdGhlIHN1Z2dlc3RlZCBhcHByb2FjaCBpcyB0byBpbml0aWFsaXplIHRoZSBjb2x1bW4iCgoKcG92ZXJ0eV9yYXRlX2RhdGEgPC0gcmVhZF94bHMoImRvY3MvUG92ZXJ0eS9oc3Rwb3YyMS54bHMiLCBza2lwPTIpICNUaGlzIG1heSBjYXVzZSBpbml0aWFsaXphdGlvbiBpc3N1ZSwgbm90IGVhc2lseSByZXByb2R1Y2libGUgKGV2ZW4gYWZ0ZXIgcmVzdGFydGluZyBSKQpgYGAKCiMjIFZpb2xlbnQgY3JpbWUKClZpb2xlbnQgY3JpbWUgZGF0YSB3YXMgb2J0YWluZWQgZnJvbSBbaGVyZV0oaHR0cHM6Ly93d3cudWNyZGF0YXRvb2wuZ292L1NlYXJjaC9DcmltZS9TdGF0ZS9TdGF0ZWJ5U3RhdGUuY2ZtKQoKYGBge3J9CmNyaW1lX2RhdGEgPC0gcmVhZF9saW5lcygiZG9jcy9DcmltZS9DcmltZVN0YXRlYnlTdGF0ZS5jc3YiLCBza2lwID0gMiwgc2tpcF9lbXB0eV9yb3dzID0gVFJVRSkKYGBgCgoKIyMgUmlnaHQtdG8tY2FycnkgZGF0YQoKYGBge3J9CgojRXh0cmFjdGVkIGZyb20gdGFibGUgaW4gW0Rvbm9odWUgcGFwZXJdKGh0dHBzOi8vd3d3Lm5iZXIub3JnL3BhcGVycy93MjM1MTAucGRmKQppZighZmlsZS5leGlzdHMoaGVyZSgiZG9jcyIsICJ3MjM1MTAucGRmIikpKXsKICB1cmwgPC0gImh0dHBzOi8vd3d3Lm5iZXIub3JnL3BhcGVycy93MjM1MTAucGRmIgogIHV0aWxzOjpkb3dubG9hZC5maWxlKHVybCwgaGVyZSgiZG9jcyIsICJ3MjM1MTAucGRmIikpCn0KCnN5bl9jb250cm9sX3BhcGVyIDwtIHBkZl90ZXh0KGhlcmUoImRvY3MiLCAidzIzNTEwLnBkZiIpKQpgYGAKCgoKCgojICoqRGF0YSBXcmFuZ2xpbmcqKgoqKioKIyMgU3RhdGUgRklQUyBjb2RlcwoKYGBge3J9CgpoZWFkKFNUQVRFX0ZJUFMpCgpjb2xuYW1lcyhTVEFURV9GSVBTKSA8LSBjKCJSZWdpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJEaXZpc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlNUQVRFRlAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJTVEFURSIpCgpjbGFzcyhTVEFURV9GSVBTJFNUQVRFRlApCgpTVEFURV9GSVBTIDwtIFNUQVRFX0ZJUFMgJT4lCiAgICBmaWx0ZXIoU1RBVEVGUCE9IjAwIikgJT4lCiAgICBkcGx5cjo6c2VsZWN0KFNUQVRFRlAsIFNUQVRFKQpgYGAKCiMjIERlbW9ncmFwaGljcwoKIyMjIyAxOTc3LTE5NzkKCgpgYGB7cn0KaGVhZChkZW1fNzdfNzkpCgpjb2xuYW1lcyhkZW1fNzdfNzkpCgpjbGFzcyhkZW1fNzdfNzkkYFllYXIgb2YgRXN0aW1hdGVgKQoKZGVtXzc3Xzc5IDwtIGRlbV83N183OSAlPiUKICBtdXRhdGUoUkFDRSA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KGBSYWNlL1NleCBJbmRpY2F0b3JgLCJCbGFjayIpIH4gIkJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGBSYWNlL1NleCBJbmRpY2F0b3JgLCJXaGl0ZSIpIH4gIldoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk90aGVyIiksCiAgICAgICAgIFNFWCA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KGBSYWNlL1NleCBJbmRpY2F0b3JgLCJmZW1hbGUiKSB+ICJGZW1hbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJNYWxlIikpICU+JQogIGRwbHlyOjpzZWxlY3QoLWBSYWNlL1NleCBJbmRpY2F0b3JgLC1gRklQUyBTdGF0ZSBDb2RlYCkKCmRlbV83N183OSA8LSBkZW1fNzdfNzkgJT4lCiAgICByZW5hbWUoIllFQVIiPWBZZWFyIG9mIEVzdGltYXRlYCwKICAgICAgICAgICAiU1RBVEUiPWBTdGF0ZSBOYW1lYCkgJT4lCiAgICBmaWx0ZXIoWUVBUiAlaW4lIDE5Nzc6MTk3OSkKICAgIApkZW1fNzdfNzkgPC0gZGVtXzc3Xzc5ICU+JQogIHBpdm90X2xvbmdlcihjb2xzPWNvbnRhaW5zKCJ5ZWFycyIpLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJBR0VfR1JPVVAiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiU1VCX1BPUCIpCgpjb2xuYW1lcyhkZW1fNzdfNzkpCgpwb3BfNzdfNzkgPC0gZGVtXzc3Xzc5ICU+JQogIGdyb3VwX2J5KFlFQVIsIFNUQVRFKSAlPiUKICBzdW1tYXJpc2UoIlRPVF9QT1AiID0gc3VtKFNVQl9QT1ApLCAuZ3JvdXBzID0gImRyb3AiKSAKCmNvbG5hbWVzKHBvcF83N183OSkKCmRlbV83N183OSA8LSBkZW1fNzdfNzkgJT4lCiAgbGVmdF9qb2luKHBvcF83N183OSwgYnkgPSBjKCJZRUFSIiwiU1RBVEUiKSkgJT4lCiAgbXV0YXRlKFBFUkNfU1VCX1BPUCA9IFNVQl9QT1AqMTAwL1RPVF9QT1ApICU+JQogIGRwbHlyOjpzZWxlY3QoLVNVQl9QT1AsIC1UT1RfUE9QKQpgYGAKCiMjIyMgMTk4MC0xOTg5CgoKCgpgYGB7cn0KZGVtXzgwXzg5IDwtIGRlbV84MF84OSAlPiUKICBtYXBfZGYoYmluZF9yb3dzKQoKc2FwcGx5KGRlbV84MF84OSwgY2xhc3MpCgpkZW1fODBfODkgPC0gZGVtXzgwXzg5ICU+JQogIG11dGF0ZShSQUNFID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoYFJhY2UvU2V4IEluZGljYXRvcmAsIkJsYWNrIikgfiAiQmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYFJhY2UvU2V4IEluZGljYXRvcmAsIldoaXRlIikgfiAiV2hpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiT3RoZXIiKSwKICAgICAgICAgU0VYID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoYFJhY2UvU2V4IEluZGljYXRvcmAsImZlbWFsZSIpIH4gIkZlbWFsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk1hbGUiKSkgJT4lCiAgZHBseXI6OnNlbGVjdCgtYFJhY2UvU2V4IEluZGljYXRvcmApCgpjb2xuYW1lcyhkZW1fODBfODkpCgpkZW1fODBfODkgPC0gZGVtXzgwXzg5ICU+JSAKICAgIHJlbmFtZSgiWUVBUiI9YFllYXIgb2YgRXN0aW1hdGVgLAogICAgICAgICAgICJTVEFURUZQX3RlbXAiPWBGSVBTIFN0YXRlIGFuZCBDb3VudHkgQ29kZXNgKSAlPiUKICAgIG11dGF0ZShTVEFURUZQID0gc3Vic3RyKFNUQVRFRlBfdGVtcCwgc3RhcnQgPSAxLCBzdG9wID0gMikpICU+JQogICAgbGVmdF9qb2luKFNUQVRFX0ZJUFMsIGJ5ID0gIlNUQVRFRlAiKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1TVEFURUZQKQoKZGVtXzgwXzg5IDwtIGRlbV84MF84OSAlPiUKICBwaXZvdF9sb25nZXIoY29scz1jb250YWlucygieWVhcnMiKSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQUdFX0dST1VQIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIlNVQl9QT1BfdGVtcCIpICU+JQogIGdyb3VwX2J5KFlFQVIsIFNUQVRFLCBBR0VfR1JPVVAsIFNFWCwgUkFDRSkgJT4lCiAgc3VtbWFyaXNlKFNVQl9QT1AgPSBzdW0oU1VCX1BPUF90ZW1wKSwgLmdyb3Vwcz0iZHJvcCIpCiAgCmNvbG5hbWVzKGRlbV84MF84OSkKCnBvcF84MF84OSA8LSBkZW1fODBfODkgJT4lCiAgZ3JvdXBfYnkoWUVBUiwgU1RBVEUpICU+JQogIHN1bW1hcmlzZSgiVE9UX1BPUCIgPSBzdW0oU1VCX1BPUCksIC5ncm91cHMgPSAiZHJvcCIpIAoKY29sbmFtZXMocG9wXzgwXzg5KQoKZGVtXzgwXzg5IDwtIGRlbV84MF84OSAlPiUKICBsZWZ0X2pvaW4ocG9wXzgwXzg5LCBieSA9IGMoIllFQVIiLCJTVEFURSIpKSAlPiUKICBtdXRhdGUoUEVSQ19TVUJfUE9QID0gU1VCX1BPUCoxMDAvVE9UX1BPUCkgJT4lCiAgZHBseXI6OnNlbGVjdCgtU1VCX1BPUCwgLVRPVF9QT1ApCmBgYAoKIyMjIyAxOTkwLTE5OTkKCgpgYGB7cn0KCgpjb2xuYW1lcyhkZW1fOTBfOTkpCgpoZWFkKGRlbV85MF85OSkKCmNvbG5hbWVzKGRlbV85MF85OSkgPC0gYygiWUVBUiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiU1RBVEVGUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiQWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJOSF9XX00iLAogICAgICAgICAgICAgICAgICAgICAgICAgIk5IX1dfRiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiTkhfQl9NIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJOSF9CX0YiLAogICAgICAgICAgICAgICAgICAgICAgICAgIk5IX0FJQU5fTSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiTkhfQUlBTl9GIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJOSF9BUElfTSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiTkhfQVBJX0YiLAogICAgICAgICAgICAgICAgICAgICAgICAgIkhfV19NIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJIX1dfRiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiSF9CX00iLAogICAgICAgICAgICAgICAgICAgICAgICAgIkhfQl9GIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJIX0FJQU5fTSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiSF9BSUFOX0YiLAogICAgICAgICAgICAgICAgICAgICAgICAgIkhfQVBJX00iLAogICAgICAgICAgICAgICAgICAgICAgICAgIkhfQVBJX0YiKQoKZGltKGRlbV85MF85OSkKCmRlbV85MF85OSA8LSBkZW1fOTBfOTkgJT4lCiAgICBtdXRhdGUoV19NID0gTkhfV19NICsgSF9XX00sCiAgICAgICAgICAgV19GID0gTkhfV19GICsgSF9XX0YsCiAgICAgICAgICAgQl9NID0gTkhfQl9NICsgSF9CX00sCiAgICAgICAgICAgQl9GID0gTkhfQl9GICsgSF9CX0YsCiAgICAgICAgICAgQUlBTl9NID0gTkhfQUlBTl9NICsgSF9BSUFOX00sCiAgICAgICAgICAgQUlBTl9GID0gTkhfQUlBTl9GICsgSF9BSUFOX0YsCiAgICAgICAgICAgQVBJX00gPSBOSF9BUElfTSArIEhfQVBJX00sCiAgICAgICAgICAgQVBJX0YgPSBOSF9BUElfRiArIEhfQVBJX0YsCiAgICAgICAgICAgbl9uYSA9IHJvd1N1bXMoaXMubmEoLikpKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1zdGFydHNfd2l0aCgiTkhfIiksIC1zdGFydHNfd2l0aCgiSF8iKSkKCmRlbV85MF85OSAlPiUKICBncm91cF9ieShuX25hKSAlPiUKICB0YWxseSgpCgplbXB0eV9yb3dzX25hIDwtIGRlbV85MF85OSAlPiUKICBncm91cF9ieShuX25hKSAlPiUKICB0YWxseSgpICU+JQogIGZpbHRlcihuX25hICE9IDApICU+JQogIHB1bGwobl9uYSkKCmRlbV85MF85OSA8LSBkZW1fOTBfOTkgJT4lCiAgZmlsdGVyKG5fbmEgIT0gZW1wdHlfcm93c19uYSkgJT4lCiAgZHBseXI6OnNlbGVjdCgtbl9uYSkKCnNhcHBseShkZW1fOTBfOTksIGNsYXNzKQoKc3VtbWFyeShhcy5mYWN0b3IoZGVtXzgwXzg5JEFHRV9HUk9VUCkpCgpkZW1fOTBfOTkgPC0gZGVtXzkwXzk5ICU+JQogIG11dGF0ZShBR0VfR1JPVVAgPSBjdXQoQWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsOTAsIGJ5PTUpLAogICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlVuZGVyIDUgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNSB0byA5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwIHRvIDE0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE1IHRvIDE5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwIHRvIDI0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjI1IHRvIDI5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMwIHRvIDM0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjM1IHRvIDM5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQwIHRvIDQ0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQ1IHRvIDQ5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUwIHRvIDU0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjU1IHRvIDU5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYwIHRvIDY0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjY1IHRvIDY5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjcwIHRvIDc0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjc1IHRvIDc5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjgwIHRvIDg0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg1IHllYXJzIGFuZCBvdmVyIikKICAgICAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGRwbHlyOjpzZWxlY3QoLUFnZSkgJT4lCiAgbXV0YXRlKEFHRV9HUk9VUCA9IGFzLmNoYXJhY3RlcihBR0VfR1JPVVApKQoKc2FwcGx5KGRlbV85MF85OSwgY2xhc3MpCgpkZW1fOTBfOTkgPC0gZGVtXzkwXzk5ICU+JQogIGdyb3VwX2J5KFlFQVIsIFNUQVRFRlAsIEFHRV9HUk9VUCkgJT4lCiAgc3VtbWFyaXNlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIldfIiksCiAgICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkJfIiksCiAgICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkFJQU5fIiksCiAgICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkFQSV8iKSksIHN1bSkgJT4lCiAgdW5ncm91cCgpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhzdGFydHNfd2l0aCgiV18iKSwKICAgICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQl8iKSwKICAgICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQUlBTl8iKSwKICAgICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQVBJXyIpKSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiUkFDRSIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJTVUJfUE9QIikKCmRlbV85MF85OSA8LSBkZW1fOTBfOTkgJT4lCiAgbXV0YXRlKFNFWCA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KFJBQ0UsICJfTSIpIH4gIk1hbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJGZW1hbGUiKSwKICAgICAgICAgUkFDRSA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KFJBQ0UsICJXXyIpIH4gIldoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KFJBQ0UsICJCXyIpIH4gIkJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk90aGVyIikpICU+JQogIGxlZnRfam9pbihTVEFURV9GSVBTLCBieSA9ICJTVEFURUZQIikgJT4lCiAgZHBseXI6OnNlbGVjdCgtU1RBVEVGUCkKCnBvcF85MF85OSA8LSBkZW1fOTBfOTkgJT4lCiAgZ3JvdXBfYnkoWUVBUiwgU1RBVEUpICU+JQogIHN1bW1hcmlzZShUT1RfUE9QID0gc3VtKFNVQl9QT1ApLCAuZ3JvdXBzID0gImRyb3AiKQoKZGVtXzkwXzk5IDwtIGRlbV85MF85OSAlPiUKICBsZWZ0X2pvaW4ocG9wXzkwXzk5LCBieT1jKCJZRUFSIiwgIlNUQVRFIikpICU+JQogIG11dGF0ZShQRVJDX1NVQl9QT1AgPSBTVUJfUE9QKjEwMC9UT1RfUE9QKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1TVUJfUE9QLCAtVE9UX1BPUCkKYGBgCgojIyMjIDIwMDAtMjAxMAoKYGBge3J9CmRlbV8wMF8xMCA8LSBkZW1fMDBfMTAgJT4lCiAgbWFwX2RmKGJpbmRfcm93cykKCnNhcHBseShkZW1fMDBfMTAsIGNsYXNzKQoKZGVtXzAwXzEwIDwtIGRlbV8wMF8xMCAlPiUKICBkcGx5cjo6c2VsZWN0KC1FU1RJTUFURVNCQVNFMjAwMCwtQ0VOU1VTMjAxMFBPUCkgJT4lCiAgZmlsdGVyKFJFR0lPTiAhPSAwLAogICAgICAgICBESVZJU0lPTiAhPSAwLAogICAgICAgICBTRVggIT0gMCwKICAgICAgICAgT1JJR0lOID09IDAsCiAgICAgICAgIFJBQ0UgIT0gMCwKICAgICAgICAgQUdFR1JQICE9IDAsCiAgICAgICAgIFNUQVRFICE9IDApICU+JQogIGRwbHlyOjpzZWxlY3QoLVJFR0lPTiwgLURJVklTSU9OLCAtT1JJR0lOLCAtU1RBVEUpICU+JQogIHJlbmFtZSgiU1RBVEUiPU5BTUUsCiAgICAgICAgICJBR0VfR1JPVVAiPUFHRUdSUCkgJT4lCiAgbXV0YXRlKFNFWCA9IGZhY3RvcihTRVgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSAxOjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJNYWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZlbWFsZSIpKSwKICAgICAgICAgUkFDRSA9IGZhY3RvcihSQUNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gMTo2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiV2hpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoIk90aGVyIiw0KSkpLAogICAgICAgICBBR0VfR1JPVVAgPSBmYWN0b3IoQUdFX0dST1VQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gMToxOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlVuZGVyIDUgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNSB0byA5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwIHRvIDE0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE1IHRvIDE5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwIHRvIDI0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjI1IHRvIDI5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMwIHRvIDM0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjM1IHRvIDM5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQwIHRvIDQ0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQ1IHRvIDQ5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUwIHRvIDU0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjU1IHRvIDU5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYwIHRvIDY0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjY1IHRvIDY5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjcwIHRvIDc0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjc1IHRvIDc5IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjgwIHRvIDg0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg1IHllYXJzIGFuZCBvdmVyIikpKSAlPiUKICBtdXRhdGUoU0VYID0gYXMuY2hhcmFjdGVyKFNFWCksCiAgICAgICAgIFJBQ0UgPSBhcy5jaGFyYWN0ZXIoUkFDRSksCiAgICAgICAgIEFHRV9HUk9VUCA9IGFzLmNoYXJhY3RlcihBR0VfR1JPVVApKQogIApjb2xuYW1lcyhkZW1fMDBfMTApCgpkZW1fMDBfMTAgPC0gZGVtXzAwXzEwICU+JQogIHBpdm90X2xvbmdlcihjb2xzPWNvbnRhaW5zKCJFU1RJTUFURSIpLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJZRUFSIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIlNVQl9QT1AiKQoKZGVtXzAwXzEwIDwtIGRlbV8wMF8xMCAlPiUKICBtdXRhdGUoWUVBUiA9IHN0cl9zdWIoWUVBUiwgc3RhcnQ9LTQpKSAlPiUKICBtdXRhdGUoWUVBUiA9IGFzLm51bWVyaWMoWUVBUikpCgpzYXBwbHkoZGVtXzAwXzEwLCBjbGFzcykKCnBvcF8wMF8xMCA8LSBkZW1fMDBfMTAgJT4lCiAgZ3JvdXBfYnkoWUVBUiwgU1RBVEUpICU+JQogIHN1bW1hcmlzZShUT1RfUE9QID0gc3VtKFNVQl9QT1ApLCAuZ3JvdXBzID0gImRyb3AiKQoKZGVtXzAwXzEwICU+JQogIGxlZnRfam9pbihwb3BfMDBfMTAsIGJ5PWMoIllFQVIiLCAiU1RBVEUiKSkgJT4lCiAgZ3JvdXBfYnkoWUVBUiwgU1RBVEUpICU+JQogIG11dGF0ZShQRVJDX1NVQl9QT1AgPSBTVUJfUE9QKjEwMC9UT1RfUE9QKSAlPiUKICBzdW1tYXJpc2UocGVyY190b3QgPSBzdW0oUEVSQ19TVUJfUE9QKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgbXV0YXRlKHBvc3NfZXJyb3IgPSBjYXNlX3doZW4oYWJzKHBlcmNfdG90IC0gMTAwKSA+IDAgfiBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gRkFMU0UpKSAlPiUKICBncm91cF9ieShwb3NzX2Vycm9yKSAlPiUKICB0YWxseSgpCgpkZW1fMDBfMTAgPC0gZGVtXzAwXzEwICU+JQogIGxlZnRfam9pbihwb3BfMDBfMTAsIGJ5PWMoIllFQVIiLCAiU1RBVEUiKSkgJT4lCiAgbXV0YXRlKFBFUkNfU1VCX1BPUCA9IFNVQl9QT1AqMTAwL1RPVF9QT1ApICU+JQogIGRwbHlyOjpzZWxlY3QoLVNVQl9QT1AsIC1UT1RfUE9QKQpgYGAKCiMjIyMgMTk3NyAtIDIwMTAKCmBgYHtyfQpzZXRlcXVhbChjb2xuYW1lcyhkZW1fNzdfNzkpLGNvbG5hbWVzKGRlbV84MF84OSkpCnNldGVxdWFsKGNvbG5hbWVzKGRlbV84MF84OSksY29sbmFtZXMoZGVtXzkwXzk5KSkKc2V0ZXF1YWwoY29sbmFtZXMoZGVtXzkwXzk5KSxjb2xuYW1lcyhkZW1fMDBfMTApKQoKaGVhZChkZW1fNzdfNzkpCmhlYWQoZGVtXzgwXzg5KQpoZWFkKGRlbV85MF85OSkKaGVhZChkZW1fMDBfMTApCgpsZW5ndGgoc3VtbWFyeShhcy5mYWN0b3IoZGVtXzc3Xzc5JEFHRV9HUk9VUCkpKQpsZW5ndGgoc3VtbWFyeShhcy5mYWN0b3IoZGVtXzgwXzg5JEFHRV9HUk9VUCkpKQpsZW5ndGgoc3VtbWFyeShhcy5mYWN0b3IoZGVtXzkwXzk5JEFHRV9HUk9VUCkpKQpsZW5ndGgoc3VtbWFyeShhcy5mYWN0b3IoZGVtXzAwXzEwJEFHRV9HUk9VUCkpKQoKZGVtIDwtIGJpbmRfcm93cyhkZW1fNzdfNzksCiAgICAgICAgICAgICAgICAgZGVtXzgwXzg5LAogICAgICAgICAgICAgICAgIGRlbV85MF85OSwKICAgICAgICAgICAgICAgICBkZW1fMDBfMTApCiAgCmRlbSAlPiUKICBmaWx0ZXIoUkFDRSA9PSAiT3RoZXIiKSAlPiUKICBncm91cF9ieShZRUFSKSAlPiUKICB0YWxseSgpICU+JQogIHN1bW1hcmlzZSh5ZWFyc19kYXRhID0gbigpKQoKMjAxMCAtIDE5NzcgKyAxCiAgCkRPTk9IVUVfQUdFX0dST1VQUyA8LSBjKCIxNSB0byAxOSB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICIyMCB0byAyNCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICIyNSB0byAyOSB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICIzMCB0byAzNCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICIzNSB0byAzOSB5ZWFycyIpCgpET05PSFVFX1JBQ0UgPC0gYygiV2hpdGUiLAogICAgICAgICAgICAgICAgICAiQmxhY2siLAogICAgICAgICAgICAgICAgICAiT3RoZXIiKQoKRE9OT0hVRV9TRVggPC0gYygiTWFsZSIpCgpkZW1fRE9OT0hVRSA8LSBkZW0gJT4lCiAgZmlsdGVyKEFHRV9HUk9VUCAlaW4lIERPTk9IVUVfQUdFX0dST1VQUywKICAgICAgICAgUkFDRSAlaW4lIERPTk9IVUVfUkFDRSwKICAgICAgICAgU0VYICVpbiUgRE9OT0hVRV9TRVgpICU+JQogIG11dGF0ZShBR0VfR1JPVVAgPSBmY3RfY29sbGFwc2UoQUdFX0dST1VQLCAiMjAgdG8gMzkgeWVhcnMiPWMoIjIwIHRvIDI0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyNSB0byAyOSB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzAgdG8gMzQgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjM1IHRvIDM5IHllYXJzIikpKSAlPiUKICBtdXRhdGUoQUdFX0dST1VQID0gc3RyX3JlcGxhY2VfYWxsKEFHRV9HUk9VUCwiICIsIl8iKSkgJT4lCiAgZ3JvdXBfYnkoWUVBUiwgU1RBVEUsIFJBQ0UsIFNFWCwgQUdFX0dST1VQKSAlPiUKICBzdW1tYXJpc2UoUEVSQ19TVUJfUE9QID0gc3VtKFBFUkNfU1VCX1BPUCksIC5ncm91cHMgPSAiZHJvcCIpICU+JQogIHVuaXRlKGNvbCA9ICJWQVJJQUJMRSIsIFJBQ0UsIFNFWCwgQUdFX0dST1VQLCBzZXAgPSAiXyIpICU+JQogIHJlbmFtZSgiVkFMVUUiPVBFUkNfU1VCX1BPUCkKCkxPVFRfQUdFX0dST1VQU19OVUxMIDwtIGMoIlVuZGVyIDUgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICI1IHRvIDkgeWVhcnMiKQoKTE9UVF9SQUNFIDwtIGMoIldoaXRlIiwKICAgICAgICAgICAgICAgIkJsYWNrIiwKICAgICAgICAgICAgICAgIk90aGVyIikKCkxPVFRfU0VYIDwtIGMoIk1hbGUiLAogICAgICAgICAgICAgICJGZW1hbGUiKQoKZGVtX0xPVFQgPC0gZGVtICU+JQogIGZpbHRlcighKEFHRV9HUk9VUCAlaW4lIExPVFRfQUdFX0dST1VQU19OVUxMKSwKICAgICAgICAgUkFDRSAlaW4lIExPVFRfUkFDRSwKICAgICAgICAgU0VYICVpbiUgTE9UVF9TRVgpICU+JQogIG11dGF0ZShBR0VfR1JPVVAgPSBmY3RfY29sbGFwc2UoQUdFX0dST1VQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwIHRvIDE5IHllYXJzIj1jKCIxMCB0byAxNCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE1IHRvIDE5IHllYXJzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAgdG8gMjkgeWVhcnMiPWMoIjIwIHRvIDI0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjUgdG8gMjkgeWVhcnMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMCB0byAzOSB5ZWFycyI9YygiMzAgdG8gMzQgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzNSB0byAzOSB5ZWFycyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQwIHRvIDQ5IHllYXJzIj1jKCI0MCB0byA0NCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQ1IHRvIDQ5IHllYXJzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTAgdG8gNjQgeWVhcnMiPWMoIjUwIHRvIDU0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTUgdG8gNTkgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2MCB0byA2NCB5ZWFycyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjY1IHllYXJzIGFuZCBvdmVyIj1jKCI2NSB0byA2OSB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjcwIHRvIDc0IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNzUgdG8gNzkgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4MCB0byA4NCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg1IHllYXJzIGFuZCBvdmVyIikpKSAlPiUKICBtdXRhdGUoQUdFX0dST1VQID0gc3RyX3JlcGxhY2VfYWxsKEFHRV9HUk9VUCwiICIsIl8iKSkgJT4lCiAgZ3JvdXBfYnkoWUVBUiwgU1RBVEUsIFJBQ0UsIFNFWCwgQUdFX0dST1VQKSAlPiUKICBzdW1tYXJpc2UoUEVSQ19TVUJfUE9QID0gc3VtKFBFUkNfU1VCX1BPUCksIC5ncm91cHMgPSAiZHJvcCIpICU+JQogIHVuaXRlKGNvbCA9ICJWQVJJQUJMRSIsIFJBQ0UsIFNFWCwgQUdFX0dST1VQLCBzZXAgPSAiXyIpICU+JQogIHJlbmFtZSgiVkFMVUUiPVBFUkNfU1VCX1BPUCkKICAKZGltKGV4cGFuZC5ncmlkKGMoMTo2KSwgYyg3OjgpLCBjKDk6MTApKSlbMV0KYGBgCgpgYGB7cn0Kc2V0ZXF1YWwoY29sbmFtZXMocG9wXzc3Xzc5KSxjb2xuYW1lcyhwb3BfODBfODkpKQpzZXRlcXVhbChjb2xuYW1lcyhwb3BfODBfODkpLGNvbG5hbWVzKHBvcF85MF85OSkpCnNldGVxdWFsKGNvbG5hbWVzKHBvcF85MF85OSksY29sbmFtZXMocG9wXzAwXzEwKSkKCmhlYWQocG9wXzc3Xzc5KQpoZWFkKHBvcF84MF84OSkKaGVhZChwb3BfOTBfOTkpCmhlYWQocG9wXzAwXzEwKQoKcG9wdWxhdGlvbl9kYXRhIDwtIGJpbmRfcm93cyhwb3BfNzdfNzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wXzgwXzg5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcF85MF85OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BfMDBfMTApCgpwb3B1bGF0aW9uX2RhdGEgJT4lCiAgZ3JvdXBfYnkoWUVBUikgJT4lCiAgdGFsbHkoKSAlPiUKICBwcmludChuID0gZGltKC4pWzFdKQoKcG9wdWxhdGlvbl9kYXRhIDwtIHBvcHVsYXRpb25fZGF0YSAlPiUKICBtdXRhdGUoVkFSSUFCTEUgPSAiUG9wdWxhdGlvbiIpICU+JQogIHJlbmFtZSgiVkFMVUUiPVRPVF9QT1ApCmBgYAoKIyMgUG9saWNlIHN0YWZmaW5nCgoKYGBge3J9CmNvbG5hbWVzKHBzX2RhdGEpCgpwc19kYXRhIDwtIHBzX2RhdGEgJT4lCiAgZmlsdGVyKGRhdGFfeWVhciA+PSAxOTc3LCAKICAgICAgICAgZGF0YV95ZWFyIDw9IDIwMTQpICU+JQogIG11dGF0ZShtYWxlX3RvdGFsX2N0ID0gY2FzZV93aGVuKGlzLm5hKG1hbGVfdG90YWxfY3QpIH4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gbWFsZV90b3RhbF9jdCksCiAgICAgICAgIGZlbWFsZV90b3RhbF9jdCA9IGNhc2Vfd2hlbihpcy5uYShmZW1hbGVfdG90YWxfY3QpIH4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gZmVtYWxlX3RvdGFsX2N0KSkgJT4lCiAgbXV0YXRlKG9mZmljZXJfdG90YWwgPSBtYWxlX3RvdGFsX2N0ICsgZmVtYWxlX3RvdGFsX2N0KSAlPiUKICBkcGx5cjo6c2VsZWN0KGRhdGFfeWVhciwKICAgICAgICAgICAgICAgIHB1Yl9hZ2VuY3lfbmFtZSwKICAgICAgICAgICAgICAgIHN0YXRlX2FiYnIsCiAgICAgICAgICAgICAgICBvZmZpY2VyX3RvdGFsKQoKcHNfZGF0YSA8LSBwc19kYXRhICU+JQogIGdyb3VwX2J5KGRhdGFfeWVhciwgc3RhdGVfYWJicikgJT4lCiAgc3VtbWFyaXNlKG9mZmljZXJfc3RhdGVfdG90YWw9c3VtKG9mZmljZXJfdG90YWwpLCAuZ3JvdXBzID0gImRyb3AiKQoKcHNfZGF0YSAlPiUKICBncm91cF9ieShzdGF0ZV9hYmJyKSAlPiUKICB0YWxseSgpICU+JQogIHByaW50KG4gPSBkaW0oLilbMV0pCgojIE5CIGlzIE5lYnJhc2thLiBUaGlzIHdhcyBjaGFuZ2VkIHRvIE5FIHRvIGF2b2lkIGNvbmZ1c2lvbnMgd2l0aCBOQiBpbiBDYW5hZGEuIFRoaXMgZGF0YXNldCB1c2VzIE5CCgpzdGF0ZV9vZl9pbnRlcmVzdF9OVUxMIDwtIGMoIkFTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHTSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1oiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBSIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWSSIpCgpzdGF0ZV9hYmJfZGYgPC0gYXMuZGF0YS5mcmFtZShjYmluZChzdGF0ZS5hYmIsIHN0YXRlLm5hbWUpKQoKY29sbmFtZXMoc3RhdGVfYWJiX2RmKSA8LSBjKCJzdGF0ZV9hYmJyIiwgIlNUQVRFIikKCnByaW50KHN0YXRlX2FiYl9kZikKCnN0YXRlX2FiYl9kZiA8LSBzdGF0ZV9hYmJfZGYgJT4lCiAgYWRkX3JvdyhzdGF0ZV9hYmJyPSJEQyIsCiAgICAgICAgICBTVEFURT0iRGlzdHJpY3Qgb2YgQ29sdW1iaWEiKQoKZGVub21pbmF0b3JfdGVtcCA8LSBwb3B1bGF0aW9uX2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdCgtVkFSSUFCTEUpICU+JQogIHJlbmFtZSgiUG9wdWxhdGlvbl90ZW1wIj1WQUxVRSkKCnBzX2RhdGEgPC0gcHNfZGF0YSAlPiUKICBmaWx0ZXIoIShzdGF0ZV9hYmJyICVpbiUgc3RhdGVfb2ZfaW50ZXJlc3RfTlVMTCkpICU+JQogIG11dGF0ZShzdGF0ZV9hYmJyID0gY2FzZV93aGVuKHN0YXRlX2FiYnIgPT0gIk5CIiB+ICJORSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IHN0YXRlX2FiYnIpKSAlPiUKICBsZWZ0X2pvaW4oc3RhdGVfYWJiX2RmLCBieSA9ICJzdGF0ZV9hYmJyIikgJT4lCiAgZHBseXI6OnNlbGVjdCgtc3RhdGVfYWJicikgJT4lCiAgcmVuYW1lKFlFQVIgPSAiZGF0YV95ZWFyIiwKICAgICAgICAgVkFMVUUgPSAib2ZmaWNlcl9zdGF0ZV90b3RhbCIpICU+JQogIG11dGF0ZShWQVJJQUJMRSA9ICJvZmZpY2VyX3N0YXRlX3RvdGFsIikgJT4lCiAgbGVmdF9qb2luKGRlbm9taW5hdG9yX3RlbXAsIGJ5PWMoIlNUQVRFIiwiWUVBUiIpKSAlPiUKICBtdXRhdGUoVkFMVUUgPSAoVkFMVUUqMTAwMDAwKSAvIFBvcHVsYXRpb25fdGVtcCkgJT4lCiAgbXV0YXRlKFZBTFVFID0gbGFnKFZBTFVFKSkgJT4lCiAgbXV0YXRlKFZBUklBQkxFID0gInBvbGljZV9wZXJfMTAwa19sYWciKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1Qb3B1bGF0aW9uX3RlbXApCmBgYAoKIyMgVW5lbXBsb3ltZW50CgoKYGBge3J9CgoKbmFtZXModWVfcmF0ZV9kYXRhKSA8LSB1ZV9yYXRlX25hbWVzCgp1ZV9yYXRlX2RhdGEkQWxhYmFtYVtkaW0odWVfcmF0ZV9kYXRhJEFsYWJhbWEpWzFdLF0KCnVlX3JhdGVfZGF0YSA8LSB1ZV9yYXRlX2RhdGEgJT4lCiAgbWFwX2RmKGJpbmRfcm93cywgLmlkID0gIlNUQVRFIikKCmNvbG5hbWVzKHVlX3JhdGVfZGF0YSkKCnNhcHBseSh1ZV9yYXRlX2RhdGEsIGNsYXNzKQoKdWVfcmF0ZV9kYXRhIDwtIHVlX3JhdGVfZGF0YSAlPiUKICBtdXRhdGUoWWVhciA9IGFzLm51bWVyaWMoWWVhcikpICU+JQogIGRwbHlyOjpzZWxlY3QoU1RBVEUsIFllYXIsIEFubnVhbCkgJT4lCiAgcmVuYW1lKCJZRUFSIj1ZZWFyLAogICAgICAgICAiVkFMVUUiPUFubnVhbCkgJT4lCiAgbXV0YXRlKFZBUklBQkxFPSJVbmVtcGxveW1lbnRfcmF0ZSIpCmBgYAoKIyMgUG92ZXJ0eSByYXRlCgoKYGBge3J9CmhlYWQocG92ZXJ0eV9yYXRlX2RhdGEpCgpjb2xuYW1lcyhwb3ZlcnR5X3JhdGVfZGF0YSkgPC0gYygiU1RBVEUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG90YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bWJlcl9zZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZXJjZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcmNlbnRfc2UiKQoKdGFpbChwb3ZlcnR5X3JhdGVfZGF0YSkKCm5vdGVzIDwtIDQKCnBvdmVydHlfcmF0ZV9kYXRhIDwtIHBvdmVydHlfcmF0ZV9kYXRhWy0oKGRpbShwb3ZlcnR5X3JhdGVfZGF0YSlbMV0tbm90ZXMrMSk6ZGltKHBvdmVydHlfcmF0ZV9kYXRhKVsxXSksXQoKc3RhdGVzX2VxIDwtIDUxCgpleHRyYV9jb2wgPC0gMgoKcmVwX3Jvd3MgPC0gc3RhdGVzX2VxICsgZXh0cmFfY29sCgpncm91cHMgPC0gKGRpbShwb3ZlcnR5X3JhdGVfZGF0YSlbMV0pLyhyZXBfcm93cykKCnBhc3RlKGdyb3VwcyAtICgyMDE4LTE5ODAgKyAxKSwgImV4dHJhIGdyb3VwcyIpCgpwb3ZlcnR5X3JhdGVfZGF0YSR5ZWFyX2dyb3VwIDwtIHJlcCgxOmdyb3VwcywgZWFjaD1yZXBfcm93cykKCnBvdmVydHlfcmF0ZV9kYXRhIDwtIHBvdmVydHlfcmF0ZV9kYXRhICU+JQogIGdyb3VwX2J5KHllYXJfZ3JvdXApICU+JQogIGdyb3VwX3NwbGl0KCkKCmhlYWQocG92ZXJ0eV9yYXRlX2RhdGFbWzFdXSkKCnBvdmVydHlfcmF0ZV9kYXRhIDwtIHBvdmVydHlfcmF0ZV9kYXRhICU+JQogIG1hcCh+bXV0YXRlKC4sCiAgICAgICAgICAgICAgcm93X2lkID0gcm93X251bWJlcigpKSkgJT4lCiAgbWFwKH5maWx0ZXIoLixyb3dfaWQgIT0gMikpICU+JQogIG1hcCh+ZHBseXI6OnNlbGVjdCguLC1yb3dfaWQpKQoKcG92ZXJ0eV9yYXRlX2RhdGFfbmFtZXMgPC0gcG92ZXJ0eV9yYXRlX2RhdGEgJT4lCiAgc2FwcGx5KC4sICJbIiwxLDEsIGRyb3A9VFJVRSkgJT4lCiAgc3RyX3JlcGxhY2VfYWxsKC4sIls6c3BhY2U6XSIsIl8iKQoKbmFtZXMocG92ZXJ0eV9yYXRlX2RhdGEpIDwtIHBvdmVydHlfcmF0ZV9kYXRhX25hbWVzCgojIFJlY2FsbCAyIGV4dHJhIGdyb3Vwcy4gCiMgZm9vdG5vdGVzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5jZW5zdXMuZ292L3RvcGljcy9pbmNvbWUtcG92ZXJ0eS9wb3ZlcnR5L2d1aWRhbmNlL3BvdmVydHktZm9vdG5vdGVzL2Nwcy1oaXN0b3JpYy1mb290bm90ZXMuaHRtbAoKcG92ZXJ0eV9yYXRlX2RhdGEkYDIwMTdfKDIxKWAgPC0gTlVMTAoKcG92ZXJ0eV9yYXRlX2RhdGEkYDIwMTNfKDE5KWAgPC0gTlVMTAoKcG92ZXJ0eV9yYXRlX2RhdGFfbmFtZXMgPC0gcG92ZXJ0eV9yYXRlX2RhdGEgJT4lCiAgc2FwcGx5KC4sICJbIiwxLDEsIGRyb3A9VFJVRSkgJT4lCiAgc3RyX3N1YiguLCBzdGFydCA9IDEsIGVuZD00KQoKbmFtZXMocG92ZXJ0eV9yYXRlX2RhdGEpIDwtIHBvdmVydHlfcmF0ZV9kYXRhX25hbWVzCgpwb3ZlcnR5X3JhdGVfZGF0YSA8LSBwb3ZlcnR5X3JhdGVfZGF0YSAlPiUKICBtYXBfZGYoYmluZF9yb3dzLCAuaWQgPSAiWUVBUiIpICU+JQogIGRwbHlyOjpzZWxlY3QoLXllYXJfZ3JvdXApCgpwb3ZlcnR5X3JhdGVfZGF0YSA8LSBwb3ZlcnR5X3JhdGVfZGF0YSAlPiUKICAgIG11dGF0ZShuX25hID0gcm93U3Vtcyhpcy5uYSguKSkpIAoKIyBUaGlzIHNob3dzIHRoYXQgdGhlcmUgaXMgc3lzdGVtYXRpYyBtaXNzaW5nIHZhbHVlcyBzdGVtbWluZ2x5ICpzb2xlbHkqIGZyb20gdGhlIHJvd3Mgd2l0aG91dCBwb3ZlcnR5IGRhdGEgYW5kIG9ubHkgYSBsYWJlbCBkZXNpZ25hdGluZyB0aGUgeWVhcgpwb3ZlcnR5X3JhdGVfZGF0YSAlPiUgCiAgZ3JvdXBfYnkobl9uYSkgJT4lCiAgdGFsbHkoKQoKc2FwcGx5KHBvdmVydHlfcmF0ZV9kYXRhLCBjbGFzcykKCnBvdmVydHlfcmF0ZV9kYXRhIDwtIHBvdmVydHlfcmF0ZV9kYXRhICU+JQogIGRyb3BfbmEoKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1OdW1iZXIsCiAgICAgICAgICAgICAgICAtTnVtYmVyX3NlLAogICAgICAgICAgICAgICAgLVBlcmNlbnRfc2UsCiAgICAgICAgICAgICAgICAtbl9uYSwKICAgICAgICAgICAgICAgIC1Ub3RhbCkgJT4lCiAgcmVuYW1lKCJWQUxVRSI9UGVyY2VudCkgJT4lCiAgbXV0YXRlKFZBUklBQkxFID0gIlBvdmVydHlfcmF0ZSIsCiAgICAgICAgIFlFQVIgPSBhcy5udW1lcmljKFlFQVIpLAogICAgICAgICBWQUxVRSA9IGFzLm51bWVyaWMoVkFMVUUpKQoKY29sbmFtZXMocG92ZXJ0eV9yYXRlX2RhdGEpCmBgYAoKIyMgVmlvbGVudCBjcmltZQoKaHR0cHM6Ly93d3cudWNyZGF0YXRvb2wuZ292L1NlYXJjaC9DcmltZS9TdGF0ZS9TdGF0ZWJ5U3RhdGUuY2ZtCgpgYGB7cn0KY3JpbWVfZGF0YSA8LSByZWFkX2xpbmVzKCJkb2NzL0NyaW1lL0NyaW1lU3RhdGVieVN0YXRlLmNzdiIsIHNraXAgPSAyLCBza2lwX2VtcHR5X3Jvd3MgPSBUUlVFKQoKbGVuZ3RoKGNyaW1lX2RhdGEpCgpjcmltZV9kYXRhIDwtIGNyaW1lX2RhdGFbLSgyMTQzOmxlbmd0aChjcmltZV9kYXRhKSldCgp4IDwtIDIwMTQtMTk3NysxCgpyZXBfY3ljbGUgPC0gMiArIDIgKyB4CgpyZXBfY3ljbGVfY3V0IDwtIDIgKyB4CgpkZWxldGVfcm93cyA8LSBjKHNlcSgyLGxlbmd0aChjcmltZV9kYXRhKSxyZXBfY3ljbGUpLAogICAgICAgICAgICAgICAgIHNlcSgzLGxlbmd0aChjcmltZV9kYXRhKSxyZXBfY3ljbGUpKQoKY3JpbWVfZGF0YSA8LSBjcmltZV9kYXRhWy1kZWxldGVfcm93c10KCmNyaW1lX2RhdGEgPC0gZGF0YS5mcmFtZShjYmluZChjcmltZV9kYXRhLCByZXAoMToobGVuZ3RoKGNyaW1lX2RhdGEpL3JlcF9jeWNsZV9jdXQpLGVhY2g9cmVwX2N5Y2xlX2N1dCkpKQoKY29sbmFtZXMoY3JpbWVfZGF0YSkgPC0gYygiU3RyaW5nIiwiU1RBVEVfR1JPVVAiKQoKY3JpbWVfZGF0YSA8LSBjcmltZV9kYXRhICU+JQogIGdyb3VwX2J5KFNUQVRFX0dST1VQKSAlPiUKICBncm91cF9zcGxpdCgpCgpjb2x1bW5zX2NyaW1lX2RhdGEgPC0gOAoKY3JpbWVfZGF0YSA8LSBjcmltZV9kYXRhICU+JQogIG1hcCh+bXV0YXRlKC4sCiAgICAgICAgICAgICAgIFN0YXRlID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoU3RyaW5nLCAiRXN0aW1hdGVkIGNyaW1lIGluICIpIH4gc3Vic3RyaW5nKFN0cmluZywgbmNoYXIoIkVzdGltYXRlZCBjcmltZSBpbiAiKSsxKSksCiAgICAgICAgICAgICAgcm93X2lkID0gcm93X251bWJlcigpKSkgJT4lCiAgbWFwKH5maWxsKC4sIFN0YXRlKSkgJT4lCiAgbWFwKH5maWx0ZXIoLixyb3dfaWQgPiAyKSkgJT4lCiAgbWFwKH5tdXRhdGUoLiwKICAgICAgICAgICAgICBTdHJpbmcgPSBwYXN0ZTAoU3RyaW5nLCAiLCIsIFN0YXRlKSkpICU+JQogIG1hcCh+ZHBseXI6OnNlbGVjdCguLFN0cmluZykpICU+JQogIG1hcCh+c3RyX3NwbGl0X2ZpeGVkKC4kU3RyaW5nLCIsIixjb2x1bW5zX2NyaW1lX2RhdGEgKyAxKSkgJT4lCiAgbWFwKH5kYXRhLmZyYW1lKC4pKSAlPiUKICBtYXAofnJlbmFtZSguLCJZRUFSIj1YMSwKICAgICAgICAgICAgICAiRXh0cmFfY29sMSI9WDIsCiAgICAgICAgICAgICAgIlZDIj1YMywKICAgICAgICAgICAgICAiRXh0cmFfY29sMiI9WDQsCiAgICAgICAgICAgICAgIkV4dHJhX2NvbDMiPVg1LAogICAgICAgICAgICAgICJFeHRyYV9jb2w0Ij1YNiwKICAgICAgICAgICAgICAiRXh0cmFfY29sNSI9WDcsCiAgICAgICAgICAgICAgIkV4dHJhX2NvbDYiPVg4LAogICAgICAgICAgICAgICJTVEFURSI9WDkpKSAlPiUKICBtYXAofmRwbHlyOjpzZWxlY3QoLiwtY29udGFpbnMoIkV4dHJhX2NvbCIpKSkgJT4lCiAgbWFwKH4ueCAlPiUgbXV0YXRlX2FsbCh+dHJpbXdzKC4sd2hpY2ggPSAiYm90aCIpKSkgJT4lCiAgbWFwX2RmKGJpbmRfcm93cykKCnNhcHBseShjcmltZV9kYXRhLCBjbGFzcykKCmNyaW1lX2RhdGEgPC0gY3JpbWVfZGF0YSAlPiUKICBtdXRhdGUoVkFSSUFCTEUgPSAiVmlvbF9jcmltZV9jb3VudCIpICU+JQogIHJlbmFtZSgiVkFMVUUiID0gVkMpICU+JQogIGFzLnRpYmJsZSgpICU+JQogIG11dGF0ZShZRUFSID0gYXMubnVtZXJpYyhZRUFSKSwKICAgICAgICAgVkFMVUUgPSBhcy5udW1lcmljKFZBTFVFKSkKYGBgCgojIyBSVEMgbGF3cwoKCmBgYHtyfQpzeW5fY29udHJvbF9wYXBlcl9wXzYyIDwtIHN5bl9jb250cm9sX3BhcGVyW1s2Ml1dCgpwXzYyIDwtIHN5bl9jb250cm9sX3BhcGVyX3BfNjIgJT4lCiAgICBzdHJzcGxpdCgiXG4iKSAlPiUKICAgIHVubGlzdCgpICU+JQogICAgYXMuZGF0YS5mcmFtZSgpICU+JQogICAgc2xpY2UoLSgxOjIpKQoKYXBwbHkocF82MiwgMSwgbmNoYXIpCgpwXzYyWzUzLF0gI3BoeXNjaWFsIHBhZ2UgNjAKCnBfNjIgPC0gcF82MiAlPiUKICAgIHNsaWNlKC01MykKCmFwcGx5KHBfNjIsIDEsIHN0cl9jb3VudCwgIlxcc3s1LH0iKQphcHBseShwXzYyLCAxLCBzdHJfY291bnQsICJcXHN7MTAsfSIpCmFwcGx5KHBfNjIsIDEsIHN0cl9jb3VudCwgIlxcc3syMCx9IikKYXBwbHkocF82MiwgMSwgc3RyX2NvdW50LCAiXFxzezQwLH0iKQoKaGVhZChjYmluZChwXzYyLCBhcHBseShwXzYyLCAxLCBzdHJfY291bnQsICJcXHN7NDAsfSIpKSkKCnBfNjIgPC0gcF82MiAlPiUKICAgIGFwcGx5KDEsc3RyX3JlcGxhY2VfYWxsLCAiXFxzezQwLH0iLCAifE4vQXwiKSAlPiUKICAgIHN0cl9yZXBsYWNlX2FsbCgiXFxzezIsMTV9IiwgInwiKSAlPiUKICAgIGFzLmRhdGEuZnJhbWUoKQoKcF82MiA8LSBzYXBwbHkocF82MiQuLCBzdHJfc3BsaXQsICJcXHx7MSx9IikKCnNhcHBseShwXzYyLCBuY2hhcikKCnBfNjIgPC0gbGFwcGx5KHBfNjIsIGZ1bmN0aW9uKHgpIHhbbmNoYXIoeCkgPiAwXSkgCgpwXzYyIDwtIGFzLmRhdGEuZnJhbWUoZG8uY2FsbChyYmluZCwgcF82MikpCgpyb3duYW1lcyhwXzYyKQoKcm93bmFtZXMocF82MikgPC0gYygpCgpjb2xuYW1lcyhwXzYyKSA8LSBjKCJTVEFURSIsCiAgICAgICAgICAgICAgICAgICAgIkVfRGF0ZV9SVEMiLAogICAgICAgICAgICAgICAgICAgICJGcmFjX1lyX0VmZl9Zcl9QYXNzIiwKICAgICAgICAgICAgICAgICAgICAiUlRDX0RhdGVfU0EiKQpzYXBwbHkocF82MiwgY2xhc3MpCgpwXzYyIDwtIHBfNjIgJT4lCiAgZHBseXI6OnNlbGVjdChTVEFURSwgUlRDX0RhdGVfU0EpICU+JQogIHJlbmFtZSgiUlRDX0xBV19ZRUFSIj1SVENfRGF0ZV9TQSkgJT4lCiAgbXV0YXRlKFJUQ19MQVdfWUVBUiA9IGFzLm51bWVyaWMoUlRDX0xBV19ZRUFSKSkgJT4lCiAgbXV0YXRlKFJUQ19MQVdfWUVBUiA9IGNhc2Vfd2hlbihSVENfTEFXX1lFQVIgPT0gMCB+IEluZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IFJUQ19MQVdfWUVBUikpCgpzYXBwbHkocF82MiwgY2xhc3MpCgpoZWFkKHBfNjIpCmBgYAoKIyMgQ2hlY2twb2ludAoKYGBge3J9CmNvbG5hbWVzKGRlbV9ET05PSFVFKQpjb2xuYW1lcyhkZW1fTE9UVCkKY29sbmFtZXModWVfcmF0ZV9kYXRhKQpjb2xuYW1lcyhwb3ZlcnR5X3JhdGVfZGF0YSkKY29sbmFtZXMoY3JpbWVfZGF0YSkKCmhlYWQoZGVtX0RPTk9IVUUpCmhlYWQoZGVtX0xPVFQpCmhlYWQodWVfcmF0ZV9kYXRhKQpoZWFkKHBvdmVydHlfcmF0ZV9kYXRhKQpoZWFkKGNyaW1lX2RhdGEpCmBgYAoKIyMgSm9pbgoKIyMgRG9ub2h1ZSwgZXQgYWwuCgpgYGB7cn0KRE9OT0hVRV9ERiA8LSBiaW5kX3Jvd3MoZGVtX0RPTk9IVUUsCiAgICAgICAgICAgICAgICAgICAgICAgIHVlX3JhdGVfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgcG92ZXJ0eV9yYXRlX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNyaW1lX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRpb25fZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgcHNfZGF0YSkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9ICJWQVJJQUJMRSIsCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSAiVkFMVUUiKSAlPiUKICBsZWZ0X2pvaW4ocF82MiAsIGJ5ID0gYygiU1RBVEUiKSkgJT4lCiAgbXV0YXRlKFJUQ19MQVcgPSBjYXNlX3doZW4oWUVBUiA+PSBSVENfTEFXX1lFQVIgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gRkFMU0UpKQoKRE9OT0hVRV9ERiAlPiUKICBncm91cF9ieShZRUFSKSAlPiUKICB0YWxseSgpICU+JQogIGZpbHRlcihuICE9IDUxKSAlPiUKICBwcmludChuPWRpbSguKVsxXSkKCnN1bW1hcnkoYXMuZmFjdG9yKERPTk9IVUVfREYkU1RBVEUpKQoKbWF4KERPTk9IVUVfREYkWUVBUikgLSBtaW4oRE9OT0hVRV9ERiRZRUFSKSArIDEKCkRPTk9IVUVfREYgPC0gRE9OT0hVRV9ERiAlPiUKICBtdXRhdGUoU1RBVEUgPSBmY3RfY29sbGFwc2UoU1RBVEUsICJEaXN0cmljdCBvZiBDb2x1bWJpYSI9YygiRGlzdHJpY3Qgb2YgQ29sdW1iaWEiLCJELkMuIikpKQoKc3VtbWFyeShhcy5mYWN0b3IoRE9OT0hVRV9ERiRTVEFURSkpCiAgCmxlbmd0aChsZXZlbHMoRE9OT0hVRV9ERiRTVEFURSkpCgpET05PSFVFX0RGIDwtIERPTk9IVUVfREYgJT4lCiAgZ3JvdXBfYnkoU1RBVEUsIFlFQVIpICU+JQogIHN1bW1hcmlzZV9hbGwofm5hLm9taXQodW5pcXVlKC4pKSkgJT4lCiAgdW5ncm91cCgpICMgVGhpcyBpZGVudGlmaWVzIHVuaXF1ZSBvYnNlcnZhdGlvbnMsIGNvYWxlc2NlcyByb3dzIGFjY29yZGluZyB0byB0aGUgZ3JvdXBpbmcgdmFyaWFibGUocyksIGFuZCBnZXRzIHJpZCBvZiBvZiB1bml0cyB0aGF0IGhhdmUgaW5jb21wbGV0ZSBkYXRhLiBUaGlzIGdpdmVzIHJldHVybnMgYSBkYXRhZnJhbWUgd2l0aCB0aGUgbW9zdCBjb21wbGV0ZSBpbmZvcm1hdGlvbi4KCnN1bW1hcnkoYXMuZmFjdG9yKERPTk9IVUVfREYkU1RBVEUpKSAKCmJhc2VsaW5lX3llYXIgPC0gbWluKERPTk9IVUVfREYkWUVBUikKY2Vuc29yaW5nX3llYXIgPC0gbWF4KERPTk9IVUVfREYkWUVBUikKCiMgTmVlZCB0byBmaXggdGhpcyB0byBlbnN1cmUgc2V2ZXJlIGJpYXMgaXMgbm90IGludHJvZHVjZWQgYnkgcHJldmFsZW50ICJjYXNlcyIKCkRPTk9IVUVfREYgPC0gRE9OT0hVRV9ERiAlPiUKICBtdXRhdGUoVElNRV8wID0gYmFzZWxpbmVfeWVhciwKICAgICAgICAgVElNRV9JTkYgPSBjZW5zb3JpbmdfeWVhcikgJT4lCiAgZmlsdGVyKFJUQ19MQVdfWUVBUiA+IFRJTUVfMCkKCkRPTk9IVUVfREYgPC0gRE9OT0hVRV9ERiAlPiUKICBtdXRhdGUoVmlvbF9jcmltZV9yYXRlXzFrID0gKFZpb2xfY3JpbWVfY291bnQqMTAwMCkvUG9wdWxhdGlvbiwKICAgICAgICAgVmlvbF9jcmltZV9yYXRlXzFrX2xvZyA9IGxvZyhWaW9sX2NyaW1lX3JhdGVfMWspLAogICAgICAgICBQb3B1bGF0aW9uX2xvZyA9IGxvZyhQb3B1bGF0aW9uKSkKCnN1bW1hcnkoZHJvcGxldmVscyhhcy5mYWN0b3IoRE9OT0hVRV9ERiRTVEFURSkpKQoKbGVuZ3RoKHN1bW1hcnkoZHJvcGxldmVscyhhcy5mYWN0b3IoRE9OT0hVRV9ERiRTVEFURSkpKSkKYGBgCgojIyBMb3R0IGFuZCBNdXN0YXJkCgpgYGB7cn0KTE9UVF9ERiA8LSBiaW5kX3Jvd3MoZGVtX0xPVFQsCiAgICAgICAgICAgICAgICAgICAgIHVlX3JhdGVfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgcG92ZXJ0eV9yYXRlX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgIGNyaW1lX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRpb25fZGF0YSwKICAgICAgICAgICAgICAgICAgICAgcHNfZGF0YSkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9ICJWQVJJQUJMRSIsCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSAiVkFMVUUiKSAlPiUKICBsZWZ0X2pvaW4ocF82MiAsIGJ5ID0gYygiU1RBVEUiKSkgJT4lCiAgbXV0YXRlKFJUQ19MQVcgPSBjYXNlX3doZW4oWUVBUiA+PSBSVENfTEFXX1lFQVIgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gRkFMU0UpKQoKTE9UVF9ERiAlPiUKICBncm91cF9ieShZRUFSKSAlPiUKICB0YWxseSgpICU+JQogIGZpbHRlcihuICE9IDUxKSAlPiUKICBwcmludChuPWRpbSguKVsxXSkKCnN1bW1hcnkoYXMuZmFjdG9yKExPVFRfREYkU1RBVEUpKQoKbWF4KExPVFRfREYkWUVBUikgLSBtaW4oTE9UVF9ERiRZRUFSKSArIDEKCkxPVFRfREYgPC0gTE9UVF9ERiAlPiUKICBtdXRhdGUoU1RBVEUgPSBmY3RfY29sbGFwc2UoU1RBVEUsICJEaXN0cmljdCBvZiBDb2x1bWJpYSI9YygiRGlzdHJpY3Qgb2YgQ29sdW1iaWEiLCJELkMuIikpKQoKc3VtbWFyeShhcy5mYWN0b3IoTE9UVF9ERiRTVEFURSkpCiAgCmxlbmd0aChsZXZlbHMoTE9UVF9ERiRTVEFURSkpCgpMT1RUX0RGIDwtIExPVFRfREYgJT4lCiAgZ3JvdXBfYnkoU1RBVEUsIFlFQVIpICU+JQogIHN1bW1hcmlzZV9hbGwofm5hLm9taXQodW5pcXVlKC4pKSkgJT4lCiAgdW5ncm91cCgpICMgVGhpcyBpZGVudGlmaWVzIHVuaXF1ZSBvYnNlcnZhdGlvbnMsIGNvYWxlc2NlcyByb3dzIGFjY29yZGluZyB0byB0aGUgZ3JvdXBpbmcgdmFyaWFibGUocyksIGFuZCBnZXRzIHJpZCBvZiBvZiB1bml0cyB0aGF0IGhhdmUgaW5jb21wbGV0ZSBkYXRhLiBUaGlzIGdpdmVzIHJldHVybnMgYSBkYXRhZnJhbWUgd2l0aCB0aGUgbW9zdCBjb21wbGV0ZSBpbmZvcm1hdGlvbi4KCnN1bW1hcnkoYXMuZmFjdG9yKExPVFRfREYkU1RBVEUpKSAKCmJhc2VsaW5lX3llYXIgPC0gbWluKExPVFRfREYkWUVBUikKY2Vuc29yaW5nX3llYXIgPC0gbWF4KExPVFRfREYkWUVBUikKCiMgTmVlZCB0byBmaXggdGhpcyB0byBlbnN1cmUgc2V2ZXJlIGJpYXMgaXMgbm90IGludHJvZHVjZWQgYnkgcHJldmFsZW50ICJjYXNlcyIKCkxPVFRfREYgPC0gTE9UVF9ERiAlPiUKICBtdXRhdGUoVElNRV8wID0gYmFzZWxpbmVfeWVhciwKICAgICAgICAgVElNRV9JTkYgPSBjZW5zb3JpbmdfeWVhcikgJT4lCiAgZmlsdGVyKFJUQ19MQVdfWUVBUiA+IFRJTUVfMCkKCkxPVFRfREYgPC0gTE9UVF9ERiAlPiUKICBtdXRhdGUoVmlvbF9jcmltZV9yYXRlXzFrID0gKFZpb2xfY3JpbWVfY291bnQqMTAwMCkvUG9wdWxhdGlvbiwKICAgICAgICAgVmlvbF9jcmltZV9yYXRlXzFrX2xvZyA9IGxvZyhWaW9sX2NyaW1lX3JhdGVfMWspLAogICAgICAgICBQb3B1bGF0aW9uX2xvZyA9IGxvZyhQb3B1bGF0aW9uKSkKCnN1bW1hcnkoZHJvcGxldmVscyhhcy5mYWN0b3IoTE9UVF9ERiRTVEFURSkpKQoKbGVuZ3RoKHN1bW1hcnkoZHJvcGxldmVscyhhcy5mYWN0b3IoTE9UVF9ERiRTVEFURSkpKSkKYGBgCgojICoqRGF0YSBFeHBsb3JhdGlvbioqCioqKgoKYGBge3J9CnNhcHBseShET05PSFVFX0RGLCBjbGFzcykKCkRPTk9IVUVfREYgJT4lCiAgbXV0YXRlKFZpb2xfY3JpbWVfcmF0ZV8xMDBrX2xvZyA9IGxvZygoVmlvbF9jcmltZV9jb3VudCoxMDAwMDApL1BvcHVsYXRpb24pKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBZRUFSLCB5ID0gVmlvbF9jcmltZV9yYXRlXzEwMGtfbG9nLCBjb2xvciA9IFNUQVRFKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDAuNSkgKwogIGdlb21fbGluZShhZXMoZ3JvdXA9U1RBVEUpLAogICAgICAgICAgICBzaXplID0gMC41LAogICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBET05PSFVFX0RGICU+JQogICAgICAgICAgICAgIG11dGF0ZShWaW9sX2NyaW1lX3JhdGVfMTAwa19sb2cgPSBsb2coKFZpb2xfY3JpbWVfY291bnQqMTAwMDAwKS9Qb3B1bGF0aW9uKSkgJT4lCiAgICAgICAgICAgICAgZmlsdGVyKFlFQVIgPT0gbGFzdChZRUFSKSksCiAgICAgICAgICAgIGFlcyhsYWJlbCA9IFNUQVRFLAogICAgICAgICAgICAgICAgeCA9IFlFQVIsCiAgICAgICAgICAgICAgICB5ID0gVmlvbF9jcmltZV9yYXRlXzEwMGtfbG9nKSwKICAgICAgICAgICAgc2l6ZSA9IDMsCiAgICAgICAgICAgIGFscGhhID0gMSwKICAgICAgICAgICAgbnVkZ2VfeCA9IDEwLAogICAgICAgICAgICBkaXJlY3Rpb24gPSAieSIsCiAgICAgICAgICAgIGhqdXN0ID0gMSwKICAgICAgICAgICAgdmp1c3QgPSAxLAogICAgICAgICAgICBzZWdtZW50LnNpemUgPSAwLjI1LAogICAgICAgICAgICBzZWdtZW50LmFscGhhID0gMC4yNSwKICAgICAgICAgICAgZm9yY2UgPSAxLAogICAgICAgICAgICBtYXguaXRlciA9IDk5OTkpICsKICBndWlkZXMoY29sb3IgPSBGQUxTRSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTk4MCwgMjAxNSwgYnkgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxOTgwLCAyMDE1KSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhzZXEoMTk4MCwgMjAxMCwgYnkgPSAxKSwgcmVwKCIiLCA1KSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDMuNSwgOC41LCBieSA9IDAuNSksCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMy41LCA4LjUpKSArCiAgbGFicyh0aXRsZSA9ICJTdGF0ZXMgaGF2ZSBkaWZmZXJlbnQgbGV2ZWxzIG9mIGNyaW1lIiwKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gImxuKHZpb2xlbnQgY3JpbWVzIHBlciAxMDAsMDAwIHBlb3BsZSkiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCkRPTk9IVUVfREYgJT4lCiAgZ3JvdXBfYnkoWUVBUikgJT4lCiAgc3VtbWFyaXNlKFZpb2xfY3JpbWVfY291bnQgPSBzdW0oVmlvbF9jcmltZV9jb3VudCksCiAgICAgICAgICAgIFBvcHVsYXRpb24gPSBzdW0oUG9wdWxhdGlvbiksCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JQogIG11dGF0ZShWaW9sX2NyaW1lX3JhdGVfMTAwa19sb2cgPSBsb2coKFZpb2xfY3JpbWVfY291bnQqMTAwMDAwKS9Qb3B1bGF0aW9uKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gWUVBUiwgeSA9IFZpb2xfY3JpbWVfcmF0ZV8xMDBrX2xvZykpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOTgwLCAyMDEwLCBieSA9IDEpLAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDE5ODAsIDIwMTApLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKHNlcSgxOTgwLCAyMDEwLCBieSA9IDEpKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoNS43NSwgNi43NSwgYnkgPSAwLjI1KSwKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyg1Ljc1LCA2Ljc1KSkgKwogIGxhYnModGl0bGUgPSAiQ3JpbWUgcmF0ZXMgZmx1Y3R1YXRlIG92ZXIgdGltZSIsCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJsbih2aW9sZW50IGNyaW1lcyBwZXIgMTAwLDAwMCBwZW9wbGUpIikgKwogIHRoZW1lX21pbmltYWwoKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQpgYGAKCiMgKipEYXRhIEFuYWx5c2lzKioKKioqCgojIyBEb25vaHVlLCBldCBhbC4KClNvbWUgY29kZSB0YWtlbiBmcm9tIGh0dHA6Ly9rYXJ0aHVyLm9yZy8yMDE5L2ltcGxlbWVudGluZy1maXhlZC1lZmZlY3RzLXBhbmVsLW1vZGVscy1pbi1yLmh0bWwKCmBgYHtyfQpkX3BhbmVsX0RPTk9IVUUgPC0gcGRhdGEuZnJhbWUoRE9OT0hVRV9ERiwgaW5kZXg9YygiU1RBVEUiLCAiWUVBUiIpKQoKRE9OT0hVRV9PVVRQVVQgPC0gcGxtKFZpb2xfY3JpbWVfcmF0ZV8xa19sb2cgfgogICAgICAgICAgICAgICAgICAgICAgICBSVENfTEFXICsKICAgICAgICAgICAgICAgICAgICAgICAgV2hpdGVfTWFsZV8xNV90b18xOV95ZWFycyArCiAgICAgICAgICAgICAgICAgICAgICAgIFdoaXRlX01hbGVfMjBfdG9fMzlfeWVhcnMgKwogICAgICAgICAgICAgICAgICAgICAgICBCbGFja19NYWxlXzE1X3RvXzE5X3llYXJzICsKICAgICAgICAgICAgICAgICAgICAgICAgQmxhY2tfTWFsZV8yMF90b18zOV95ZWFycyArCiAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyX01hbGVfMTVfdG9fMTlfeWVhcnMgKwogICAgICAgICAgICAgICAgICAgICAgICBPdGhlcl9NYWxlXzIwX3RvXzM5X3llYXJzICsKICAgICAgICAgICAgICAgICAgICAgICAgVW5lbXBsb3ltZW50X3JhdGUgKwogICAgICAgICAgICAgICAgICAgICAgICBQb3ZlcnR5X3JhdGUgKyAKICAgICAgICAgICAgICAgICAgICAgICAgUG9wdWxhdGlvbl9sb2cgKyAKICAgICAgICAgICAgICAgICAgICAgICAgcG9saWNlX3Blcl8xMDBrX2xhZywKICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdCA9ICJ0d293YXlzIiwKICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gIndpdGhpbiIsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRfcGFuZWxfRE9OT0hVRSkKCnN1bW1hcnkoRE9OT0hVRV9PVVRQVVQpCgpET05PSFVFX09VVFBVVF9USURZIDwtIHRpZHkoRE9OT0hVRV9PVVRQVVQsIGNvbmYuaW50ID0gMC45NSkKCkRPTk9IVUVfT1VUUFVUX1RJRFkkQW5hbHlzaXMgPC0gIkFuYWx5c2lzIDEiCmBgYAoKIyMgTG90dCBhbmQgTXVzdGFyZAoKU29tZSBjb2RlIHRha2VuIGZyb20gaHR0cDovL2thcnRodXIub3JnLzIwMTkvaW1wbGVtZW50aW5nLWZpeGVkLWVmZmVjdHMtcGFuZWwtbW9kZWxzLWluLXIuaHRtbAoKYGBge3J9CkxPVFRfdmFyaWFibGVzIDwtIExPVFRfREYgJT4lCiAgZHBseXI6OnNlbGVjdChSVENfTEFXLAogICAgICAgICAgICAgICAgY29udGFpbnMoYygiV2hpdGUiLCJCbGFjayIsIk90aGVyIikpLAogICAgICAgICAgICAgICAgVW5lbXBsb3ltZW50X3JhdGUsCiAgICAgICAgICAgICAgICBQb3ZlcnR5X3JhdGUsCiAgICAgICAgICAgICAgICBQb3B1bGF0aW9uX2xvZywKICAgICAgICAgICAgICAgIHBvbGljZV9wZXJfMTAwa19sYWcpICU+JQogIGNvbG5hbWVzKCkKCkxPVFRfZm1sYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJWaW9sX2NyaW1lX3JhdGVfMWtfbG9nIH4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZShMT1RUX3ZhcmlhYmxlcywgY29sbGFwc2UgPSAiICsgIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApCgpkX3BhbmVsX0xPVFQgPC0gcGRhdGEuZnJhbWUoTE9UVF9ERiwgaW5kZXg9YygiU1RBVEUiLCAiWUVBUiIpKQoKTE9UVF9PVVRQVVQgPC0gcGxtKExPVFRfZm1sYSwKICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gIndpdGhpbiIsCiAgICAgICAgICAgICAgICAgICBlZmZlY3QgPSAidHdvd2F5cyIsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRfcGFuZWxfTE9UVCkKCnN1bW1hcnkoTE9UVF9PVVRQVVQpCgpMT1RUX09VVFBVVF9USURZIDwtIHRpZHkoTE9UVF9PVVRQVVQsIGNvbmYuaW50ID0gMC45NSkKCkxPVFRfT1VUUFVUX1RJRFkkQW5hbHlzaXMgPC0gIkFuYWx5c2lzIDIiCmBgYAoKIyMgQ29tcGFyaW5nIGFuYWx5c2VzCgpgYGB7cn0KY29tcGFyaW5nX2FuYWx5c2VzIDwtIERPTk9IVUVfT1VUUFVUX1RJRFkgJT4lCiAgYmluZF9yb3dzKExPVFRfT1VUUFVUX1RJRFkpICU+JQogIGZpbHRlcih0ZXJtID09ICJSVENfTEFXVFJVRSIpCgpsaWJyYXJ5KGdyaWQpCgpjb21wYXJpbmdfYW5hbHlzZXNfcGxvdCA8LSBnZ3Bsb3QoY29tcGFyaW5nX2FuYWx5c2VzKSArIAogIGdlb21fcG9pbnQoYWVzKHggPSBBbmFseXNpcywgeSA9IGVzdGltYXRlKSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHggPSBBbmFseXNpcywgeW1pbiA9IGNvbmYubG93LCB5bWF4ID0gY29uZi5oaWdoKSwgd2lkdGggPSAwLjI1KSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gInJlZCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0wLjIsIDAuMiwgYnkgPSAwLjA1KSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKC0wLjIsIDAuMiwgYnkgPSAwLjA1KSwKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtMC4yLDAuMikpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAxLCB5ID0gMC4xMjUsIHhlbmQgPSAxLCB5ZW5kID0gMC4xNzUpLAogICAgICAgICAgICAgICBhcnJvdyA9IGFycm93KGFuZ2xlID0gNDUsIGVuZHMgPSAibGFzdCIsIHR5cGUgPSAib3BlbiIpLAogICAgICAgICAgICAgICBzaXplID0gMiwKICAgICAgICAgICAgICAgY29sb3IgPSAiZ3JlZW4iLAogICAgICAgICAgICAgICBsaW5lZW5kID0gImJ1dHQiLAogICAgICAgICAgICAgICBsaW5lam9pbiA9ICJtaXRyZSIpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAyLCB5ID0gLTAuMTI1LCB4ZW5kID0gMiwgeWVuZCA9IC0wLjE3NSksCiAgICAgICAgICAgICAgIGFycm93ID0gYXJyb3coYW5nbGUgPSA0NSwgZW5kcyA9ICJsYXN0IiwgdHlwZSA9ICJvcGVuIiksCiAgICAgICAgICAgICAgIHNpemUgPSAyLAogICAgICAgICAgICAgICBjb2xvciA9ICJyZWQiLAogICAgICAgICAgICAgICBsaW5lZW5kID0gImJ1dHQiLAogICAgICAgICAgICAgICBsaW5lam9pbiA9ICJtaXRyZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKyAKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICsKICBsYWJzKHRpdGxlID0gIkVmZmVjdCBlc3RpbWF0ZSBvbiBsbih2aW9sZW50IGNyaW1lcyBwZXIgMTAwLDAwMCBwZW9wbGUpIiwKICAgICAgIHkgPSAiRWZmZWN0IGVzdGltYXRlICg5NSUgQ0kpIikKCmNvbXBhcmluZ19hbmFseXNlc19wbG90CmBgYAoKIyBNdWx0aWNvbGxpbmVhcml0eSBhbmFseXNpcwoKSG93IGRpZCB0aGUgYWJvdmUgaGFwcGVuPwoKVGhlIGFuYWx5c2lzIGRhdGFmcmFtZXMgYXJlIHZlcnkgc2ltaWxhciB5ZXQgcmVuZGVyZWQgdmVyeSBkaWZmZXJlbnQgcmVzdWx0cy4gCgpgYGB7cn0KYWxsX2VxdWFsKHRhcmdldCA9IERPTk9IVUVfREYsCiAgICAgICAgICBjdXJyZW50ID0gTE9UVF9ERiwKICAgICAgICAgIGlnbm9yZV9jb2xfb3JkZXIgPSBUUlVFLAogICAgICAgICAgaWdub3JlX3Jvd19vcmRlciA9IFRSVUUpCgpkaW0oRE9OT0hVRV9ERilbMV0gPT0gZGltKExPVFRfREYpWzFdCmBgYAoKVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gZGF0YWZyYW1lcyByZXN0cyBpbiBob3cgdGhlIGRlbW9ncmFwaGljIHZhcmlhYmxlcyB3ZXJlIHBhcmFtZXRlcml6ZWQuCgpgYGB7cn0KRE9OT0hVRV9ERiAlPiUKICBkcGx5cjo6c2VsZWN0KGNvbnRhaW5zKCJ5ZWFycyIpKSAlPiUKICBjb2xuYW1lcygpCgpMT1RUX0RGICU+JQogIGRwbHlyOjpzZWxlY3QoY29udGFpbnMoInllYXJzIikpICU+JQogIGNvbG5hbWVzKCkKYGBgCgpDbGVhcmx5LCB0aGlzIGhhZCBhbiBlZmZlY3Qgb24gdGhlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLiAKCkxldCdzIGV4cGxvcmUgaG93IHRoaXMgb2NjdXJlZC4gCgpXaGVuIHNlZW1pbmdseSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgYXJlIGhpZ2hseSByZWxhdGVkIHRvIG9uZSBhbm90aGVyLCB0aGUgcmVsYXRpb25zaGlwcyBlc3RpbWF0ZWQgaW4gYW4gYW5hbHlzaXMgbWF5IGJlIGRpc3RvcnRlZC4gCgpJbiByZWdyZXNzaW9uIGFuYWx5c2lzLCB0aGlzIGRpc3RvcnRpb24gaXMgb2Z0ZW4gYSBieXByb2R1Y3Qgb2YgYSB2aW9sYXRpb24gb2YgdGhlIGluZGVwZW5kZW5jZSBhc3N1bXB0aW9uLiBUaGlzIGRpc3RvcnRpb24sIGlmIGxhcmdlIGVub3VnaCwgY2FuIGltcGFjdCBzdGF0aXN0aWNhbCBpbmZlcmVuY2UuIAoKVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB3ZSBjYW4gZGlhZ25vc2UgbXVsdGljb2xsaW5lYXJpdHkuCgojIyMgQ29ycmVsYXRpb24KCkFnYWluLCBtdWx0aWNvbGxpbmVhcml0eSBvZnRlbiBvY2N1cnMgd2hlbiBpbmRlcGVuZGVudCB2YXJpYWJsZXMgYXJlIGhpZ2hseSByZWxhdGVkIHRvIG9uZSBhbm90aGVyLiBDb25zZXF1ZW50bHksIHdlIGNhbiBldmFsdWF0ZSB0aGVzZSByZWxhdGlvbnNoaXBzIGJlIGV4YW1pbmluZyB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiB2YXJpYWJsZSBwYWlycy4KCjxzdHlsZT4KZGl2LmJsdWUgeyBiYWNrZ3JvdW5kLWNvbG9yOiNlNmYwZmY7IGJvcmRlci1yYWRpdXM6IDVweDsgcGFkZGluZzogMjBweDt9Cjwvc3R5bGU+CjxkaXYgY2xhc3MgPSAiYmx1ZSI+CgpJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IG11bHRpY29sbGluZWFyaXR5IGFuZCBjb3JyZWxhdGlvbiBhcmUgbm90IG9uZSBhbmQgdGhlIHNhbWUuIENvcnJlbGF0aW9uIGNhbiBiZSB0aG91Z2h0IG9mIGFzIHRoZSBzdHJlbmd0aCBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdmFyaWFibGVzLiBPbiB0aGUgb3RoZXIgaGFuZCwgbXVsdGljb2xsaW5lYXJpdHkgY2FuIGJlIHRob3VnaHQgb2YgdGhlIHRoZSB2aW9sYXRpb24gb2YgdGhlIGluZGVwZW5kZW5jZSBhc3N1bXB0aW9uIHRoYXQgaXMgYSBjb25zZXF1ZW5jZSBvZiB0aGlzIGNvcnJlbGF0aW9uIGluIGEgcmVncmVzc2lvbiBhbmFseXNpcy4gCgo8L2Rpdj4KCiMjIyMgU2NhdHRlcnBsb3RzCgpgYGB7cn0KY29sbmFtZXMoRE9OT0hVRV9ERikKCkRPTk9IVUVfREYgJT4lIAogIGRwbHlyOjpzZWxlY3QoUlRDX0xBVywKICAgICAgICAgICAgICAgIFZpb2xfY3JpbWVfcmF0ZV8xa19sb2csCiAgICAgICAgICAgICAgICBVbmVtcGxveW1lbnRfcmF0ZSwKICAgICAgICAgICAgICAgIFBvdmVydHlfcmF0ZSwKICAgICAgICAgICAgICAgIFBvcHVsYXRpb25fbG9nKSAlPiUgCiAgZ2dwYWlycyguLAogICAgICAgICAgY29sdW1ucyA9IGMoMjo1KSwKICAgICAgICAgIGxvd2VyID0gbGlzdChjb250aW51b3VzID0gd3JhcCgic21vb3RoX2xvZXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAwLjEpKSkKCkxPVFRfREYgJT4lIAogIGRwbHlyOjpzZWxlY3QoUlRDX0xBVywKICAgICAgICAgICAgICAgIFZpb2xfY3JpbWVfcmF0ZV8xa19sb2csCiAgICAgICAgICAgICAgICBVbmVtcGxveW1lbnRfcmF0ZSwKICAgICAgICAgICAgICAgIFBvdmVydHlfcmF0ZSwKICAgICAgICAgICAgICAgIFBvcHVsYXRpb25fbG9nKSAlPiUgCiAgZ2dwYWlycyguLAogICAgICAgICAgY29sdW1ucyA9IGMoMjo1KSwKICAgICAgICAgIGxvd2VyID0gbGlzdChjb250aW51b3VzID0gd3JhcCgic21vb3RoX2xvZXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAwLjEpKSkKYGBgCgojIyMjIEhlYXRtYXBzCgpgYGB7cn0KY29yX0RPTk9IVUVfZGVtIDwtIGNvcihET05PSFVFX0RGICU+JSBkcGx5cjo6c2VsZWN0KGNvbnRhaW5zKCJfeWVhcnMiKSkpCgpjb3JyX21hdF9ET05PSFVFIDwtIGdnY29ycnBsb3QoY29yX0RPTk9IVUVfZGVtLAogICAgICAgICAgIHRsLmNleCA9IDYsCiAgICAgICAgICAgaGMub3JkZXIgPSBUUlVFLAogICAgICAgICAgIGNvbG9ycyA9IGMoInJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgICAgInJlZCIpLAogICAgICAgICAgIG91dGxpbmUuY29sb3IgPSAidHJhbnNwYXJlbnQiLAogICAgICAgICAgIHRpdGxlID0gIkNvcnJlbGF0aW9uIE1hdHJpeCwgQW5hbHlzaXMgMSIsCiAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gVGVYKCIkXFxyaG8kIikpCgpjb3JyX21hdF9ET05PSFVFCgpjb3JfTE9UVF9kZW0gPC0gY29yKExPVFRfREYgJT4lIGRwbHlyOjpzZWxlY3QoY29udGFpbnMoIl95ZWFycyIpKSkKCmNvcnJfbWF0X0xPVFQgPC0gZ2djb3JycGxvdChjb3JfTE9UVF9kZW0sCiAgICAgICAgICAgdGwuY2V4ID0gNiwKICAgICAgICAgICBoYy5vcmRlciA9IFRSVUUsCiAgICAgICAgICAgY29sb3JzID0gYygicmVkIiwKICAgICAgICAgICAgICAgICAgICAgICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAicmVkIiksCiAgICAgICAgICAgb3V0bGluZS5jb2xvciA9ICJ0cmFuc3BhcmVudCIsCiAgICAgICAgICAgdGl0bGUgPSAiQ29ycmVsYXRpb24gTWF0cml4LCBBbmFseXNpcyAyIiwKICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBUZVgoIiRcXHJobyQiKSkKCmNvcnJfbWF0X0xPVFQKYGBgCgojIyMgQ29lZmZpY2llbnQgZXN0aW1hdGUgaW5zdGFiaWxpdHkKCmBgYHtyfQpzaW1zIDwtIDI1MAoKIyBET05PSFVFCgojIHJvdW5kKGRpbShET05PSFVFX0RGKVsxXS8yKQpzYW1wc19ET05PSFVFIDwtIGxhcHBseShyZXAoZGltKERPTk9IVUVfREYpWzFdLTEsIHNpbXMpLAogICAgICAgZnVuY3Rpb24oeClET05PSFVFX0RGW3NhbXBsZShucm93KERPTk9IVUVfREYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHgsIHJlcGxhY2UgPSBGQUxTRSksXSkKCmZpdF9ubHNfb25fYm9vdHN0cmFwX0RPTk9IVUUgPC0gZnVuY3Rpb24oc3BsaXQpewogIHBsbShWaW9sX2NyaW1lX3JhdGVfMWtfbG9nIH4KICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0xBVyArCiAgICAgICAgICAgICAgICAgICAgICAgIFdoaXRlX01hbGVfMTVfdG9fMTlfeWVhcnMgKwogICAgICAgICAgICAgICAgICAgICAgICBXaGl0ZV9NYWxlXzIwX3RvXzM5X3llYXJzICsKICAgICAgICAgICAgICAgICAgICAgICAgQmxhY2tfTWFsZV8xNV90b18xOV95ZWFycyArCiAgICAgICAgICAgICAgICAgICAgICAgIEJsYWNrX01hbGVfMjBfdG9fMzlfeWVhcnMgKwogICAgICAgICAgICAgICAgICAgICAgICBPdGhlcl9NYWxlXzE1X3RvXzE5X3llYXJzICsKICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJfTWFsZV8yMF90b18zOV95ZWFycyArCiAgICAgICAgICAgICAgICAgICAgICAgIFVuZW1wbG95bWVudF9yYXRlICsKICAgICAgICAgICAgICAgICAgICAgICAgUG92ZXJ0eV9yYXRlICsgCiAgICAgICAgICAgICAgICAgICAgICAgIFBvcHVsYXRpb25fbG9nICsgCiAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljZV9wZXJfMTAwa19sYWcsCiAgICAgIGRhdGEgPSBkYXRhLmZyYW1lKHNwbGl0KSwKICAgICAgaW5kZXggPSBjKCJTVEFURSIsIllFQVIiKSwKICAgICAgbW9kZWwgPSAid2l0aGluIiwKICAgICAgZWZmZWN0ID0gInR3b3dheXMiKQp9CiAgCnNhbXBzX21vZGVsc19ET05PSFVFIDwtIGxhcHBseShzYW1wc19ET05PSFVFLCBmaXRfbmxzX29uX2Jvb3RzdHJhcF9ET05PSFVFKQoKc2FtcHNfbW9kZWxzX0RPTk9IVUUgPC0gc2FtcHNfbW9kZWxzX0RPTk9IVUUgJT4lCiAgbWFwKHRpZHkpCgpuYW1lcyhzYW1wc19tb2RlbHNfRE9OT0hVRSkgPC0gcGFzdGUwKCJET05PSFVFXyIsMTpsZW5ndGgoc2FtcHNfbW9kZWxzX0RPTk9IVUUpKQoKc2ltdWxhdGlvbnNfRE9OT0hVRSA8LSBzYW1wc19tb2RlbHNfRE9OT0hVRSAlPiUKICBiaW5kX3Jvd3MoLmlkID0gIklEIikgJT4lCiAgbXV0YXRlKEFuYWx5c2lzID0gIkFuYWx5c2lzIDEiKQoKIyMgTE9UVAoKc2FtcHNfTE9UVCA8LSBsYXBwbHkocmVwKHJvdW5kKGRpbShMT1RUX0RGKVsxXS8yKSwgc2ltcyksCiAgICAgICBmdW5jdGlvbih4KSBMT1RUX0RGW3NhbXBsZShucm93KExPVFRfREYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHgsIHJlcGxhY2UgPSBGQUxTRSksXSkKCmZpdF9ubHNfb25fYm9vdHN0cmFwX0xPVFQgPC0gZnVuY3Rpb24oc3BsaXQpewogIHBsbShMT1RUX2ZtbGEsCiAgICAgIGRhdGEgPSBkYXRhLmZyYW1lKHNwbGl0KSwKICAgICAgaW5kZXggPSBjKCJTVEFURSIsIllFQVIiKSwKICAgICAgbW9kZWwgPSAid2l0aGluIiwKICAgICAgZWZmZWN0ID0gInR3b3dheXMiKQp9CiAgCnNhbXBzX21vZGVsc19MT1RUIDwtIGxhcHBseShzYW1wc19MT1RULCBmaXRfbmxzX29uX2Jvb3RzdHJhcF9MT1RUKQoKc2FtcHNfbW9kZWxzX0xPVFQgPC0gc2FtcHNfbW9kZWxzX0xPVFQgJT4lCiAgbWFwKHRpZHkpCgpuYW1lcyhzYW1wc19tb2RlbHNfTE9UVCkgPC0gcGFzdGUwKCJMT1RUXyIsMTpsZW5ndGgoc2FtcHNfbW9kZWxzX0xPVFQpKQoKc2ltdWxhdGlvbnNfTE9UVCA8LSBzYW1wc19tb2RlbHNfTE9UVCAlPiUKICBiaW5kX3Jvd3MoLmlkID0gIkFuYWx5c2lzIikgJT4lCiAgbXV0YXRlKEFuYWx5c2lzID0gIkFuYWx5c2lzIDIiKQoKc2ltdWxhdGlvbnMgPC0gYmluZF9yb3dzKHNpbXVsYXRpb25zX0RPTk9IVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaW11bGF0aW9uc19MT1RUKQoKc2ltdWxhdGlvbl9wbG90IDwtIHNpbXVsYXRpb25zICU+JQogIGZpbHRlcih0ZXJtPT0iUlRDX0xBV1RSVUUiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBBbmFseXNpcywgeSA9IGVzdGltYXRlKSkgKyAKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMjUsCiAgICAgICAgICAgICAgd2lkdGggPSAwLjEpICsgCiAgbGFicyh0aXRsZSA9ICJDb2VmZmljaWVudCBpbnN0YWJpbGl0eSIsCiAgICAgICBzdWJ0aXRsZSA9ICJFc3RpbWF0ZXMgc2Vuc2l0aXZlIHRvIG9ic2VydmF0aW9uIGRlbGV0aW9ucyIsCiAgICAgICB4ID0gIlRlcm0iLAogICAgICAgeSA9ICJDb2VmZmljaWVudCIsCiAgICAgICBjYXB0aW9uID0gIlJlc3VsdHMgZnJvbSBzaW11bGF0aW9ucyIpICsgCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpCgpzaW11bGF0aW9uX3Bsb3QKYGBgCgojIyMgVklGCgpgYGB7cn0KZGVzaWduLm1hdHJpeCA8LSBhcy5kYXRhLmZyYW1lKG1vZGVsLm1hdHJpeChET05PSFVFX09VVFBVVCkpCgpkZXNpZ24ubWF0cml4JFZpb2xfY3JpbWVfcmF0ZV8xa19sb2cgPC0gcGxtOjpXaXRoaW4oCiAgZF9wYW5lbF9ET05PSFVFJFZpb2xfY3JpbWVfcmF0ZV8xa19sb2cpCgpsbV9ET05PSFVFIDwtIGxtKFZpb2xfY3JpbWVfcmF0ZV8xa19sb2cgfgogICAgICAgICAgICAgICAgICAgICAgICBSVENfTEFXVFJVRSArICMgbG9naWNhbCBjbGFzcyBjaGFuZ2VzIHZhcmlhYmxlIG5hbWUgYWZ0ZXIgaW5pdGFsIG1vZGVsCiAgICAgICAgICAgICAgICAgICAgICAgIFdoaXRlX01hbGVfMTVfdG9fMTlfeWVhcnMgKwogICAgICAgICAgICAgICAgICAgICAgICBXaGl0ZV9NYWxlXzIwX3RvXzM5X3llYXJzICsKICAgICAgICAgICAgICAgICAgICAgICAgQmxhY2tfTWFsZV8xNV90b18xOV95ZWFycyArCiAgICAgICAgICAgICAgICAgICAgICAgIEJsYWNrX01hbGVfMjBfdG9fMzlfeWVhcnMgKwogICAgICAgICAgICAgICAgICAgICAgICBPdGhlcl9NYWxlXzE1X3RvXzE5X3llYXJzICsKICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJfTWFsZV8yMF90b18zOV95ZWFycyArCiAgICAgICAgICAgICAgICAgICAgICAgIFVuZW1wbG95bWVudF9yYXRlICsKICAgICAgICAgICAgICAgICAgICAgICAgUG92ZXJ0eV9yYXRlICsgCiAgICAgICAgICAgICAgICAgICAgICAgIFBvcHVsYXRpb25fbG9nICsKICAgICAgICAgICAgICAgcG9saWNlX3Blcl8xMDBrX2xhZywKICAgICAgICAgICAgIGRhdGEgPSBkZXNpZ24ubWF0cml4KQoKCnZpZihsbV9ET05PSFVFKQoKdmlmX0RPTk9IVUUgPC0gdmlmKGxtX0RPTk9IVUUpCgp2aWZfRE9OT0hVRSA8LSB2aWZfRE9OT0hVRSAlPiUKICBhc190aWJibGUoKSAlPiUKICBjYmluZCguLCBuYW1lcyh2aWZfRE9OT0hVRSkpICU+JQogIGFzX3RpYmJsZSgpCiAgCmNvbG5hbWVzKHZpZl9ET05PSFVFKSA8LSBjKCJWSUYiLCAiVmFyaWFibGUiKQoKbWF4X3ZpZl9ET05PSFVFIDwtIG1heCh2aWYobG1fRE9OT0hVRSkpIApgYGAKCmBgYHtyfQpkZXNpZ24ubWF0cml4IDwtIGFzLmRhdGEuZnJhbWUobW9kZWwubWF0cml4KExPVFRfT1VUUFVUKSkKCmRlc2lnbi5tYXRyaXgkVmlvbF9jcmltZV9yYXRlXzFrX2xvZyA8LSBwbG06OldpdGhpbigKICBkX3BhbmVsX0xPVFQkVmlvbF9jcmltZV9yYXRlXzFrX2xvZykKCkxPVFRfdmFyaWFibGVzX29scyA8LSBMT1RUX0RGICU+JQogIGRwbHlyOjpzZWxlY3QoUlRDX0xBVywKICAgICAgICAgICAgICAgIGNvbnRhaW5zKGMoIldoaXRlIiwiQmxhY2siLCJPdGhlciIpKSwKICAgICAgICAgICAgICAgIFVuZW1wbG95bWVudF9yYXRlLAogICAgICAgICAgICAgICAgUG92ZXJ0eV9yYXRlLAogICAgICAgICAgICAgICAgUG9wdWxhdGlvbl9sb2csCiAgICAgICAgICAgICAgICBwb2xpY2VfcGVyXzEwMGtfbGFnKSAlPiUKICBjb2xuYW1lcygpICU+JQogIHN0cl9yZXBsYWNlKCJSVENfTEFXIiwgIlJUQ19MQVdUUlVFIikgIyBsb2dpY2FsIGNsYXNzIGNoYW5nZXMgdmFyaWFibGUgbmFtZSBhZnRlciBpbml0YWwgbW9kZWwKCkxPVFRfZm1sYV9vbHMgPC0gYXMuZm9ybXVsYShwYXN0ZSgiVmlvbF9jcmltZV9yYXRlXzFrX2xvZyB+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUoTE9UVF92YXJpYWJsZXNfb2xzLCBjb2xsYXBzZSA9ICIgKyAiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICkKCmxtX0xPVFQgPC0gbG0oTE9UVF9mbWxhX29scywKICAgICAgICAgICAgIGRhdGEgPSBkZXNpZ24ubWF0cml4KQoKdmlmKGxtX0xPVFQpCgp2aWZfTE9UVCA8LSB2aWYobG1fTE9UVCkKCnZpZl9MT1RUIDwtIHZpZl9MT1RUICU+JQogIGFzX3RpYmJsZSgpICU+JQogIGNiaW5kKC4sIG5hbWVzKHZpZl9MT1RUKSkgJT4lCiAgYXNfdGliYmxlKCkKICAKY29sbmFtZXModmlmX0xPVFQpIDwtIGMoIlZJRiIsICJWYXJpYWJsZSIpCgptYXhfdmlmX0xPVFQgPC0gbWF4KHZpZihsbV9MT1RUKSkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRX0KI1RoaXMgY291bGQgYmUgdXNlZCB0byBsYWJlbCB0aGUgbWF4IFZJRiBvZiBlYWNoIGFuYWx5c2lzCgptYXhfdmlmX0RPTk9IVUUKbWF4X3ZpZl9MT1RUCmBgYAoKJCRcZnJhY3sxfXsxLVJfe2l9XnsyfX0kJAoKYGBge3J9CnZpZl9ET05PSFVFJEFuYWx5c2lzIDwtICJBbmFseXNpcyAxIgp2aWZfTE9UVCRBbmFseXNpcyA8LSAiQW5hbHlzaXMgMiIKCnZpZl9kZiA8LSByYmluZCh2aWZfRE9OT0hVRSwKICAgICAgICAgICAgICAgIHZpZl9MT1RUKQoKdmlmX3Bsb3QgPC0gdmlmX2RmICU+JQogIGdncGxvdChhZXMoeCA9IEFuYWx5c2lzLCB5ID0gVklGKSkgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4xLCBhbHBoYSA9IDAuNSwgc2l6ZSA9IDIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxMCwgY29sb3IgPSAicmVkIikgKwogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICdsb2cxMCcsCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwxMDAwKSkgKwogIGxhYnModGl0bGUgPSAiVmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvcnMiKSArIAogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQoKdmlmX3Bsb3QKYGBgCgojIFN5bnRoZXNpcwoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnRpdGxlX3Bsb3RzIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgKICAgICJNdWx0aWNvbGxpbmVhcml0eSBhbmQgaXRzIGVmZmVjdHMiLAogICAgZm9udGZhY2UgPSAnYm9sZCcsCiAgICBzaXplPTE4LAogICAgeCA9IDAsCiAgICBoanVzdCA9IDAKICApICsKICB0aGVtZSgKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApCiAgKQoKZm9yd2FyZCA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoCiAgICAiQW5hbHlzaXMgMTogNiBkZW1vZ3JhcGhpYyB2YXJpYWJsZXNcbkFuYWx5c2lzIDI6IDM2IGRlbW9ncmFwaGljIHZhcmlhYmxlcyIsCiAgICBmb250ZmFjZSA9ICdib2xkJywKICAgIHNpemU9MTAsCiAgICB4ID0gMCwKICAgIGhqdXN0ID0gMAogICkgKwogIHRoZW1lKAogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgMCkKICApCgpjb3JyX21hdF9ET05PSFVFIDwtIGdnY29ycnBsb3QoY29yX0RPTk9IVUVfZGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGwuY2V4ID0gNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjLm9yZGVyID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUuY29sb3IgPSAidHJhbnNwYXJlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzID0gYygicmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gVGVYKCIkXFxyaG8kIikpICsKICB0aGVtZV92b2lkKCkgKyAKICB0aGVtZShwbG90LnRpdGxlPSBlbGVtZW50X3RleHQoc2l6ZT04KSkgKwogIGxhYnModGl0bGUgPSAiQW5hbHlzaXMgMSIpIAoKY29ycl9tYXRfTE9UVCA8LSBnZ2NvcnJwbG90KGNvcl9MT1RUX2RlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsLmNleCA9IDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYy5vcmRlciA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLmNvbG9yID0gInRyYW5zcGFyZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycyA9IGMoInJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IFRlWCgiJFxccmhvJCIpKSArCiAgdGhlbWVfdm9pZCgpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTgpKSArCiAgbGFicyh0aXRsZSA9ICJBbmFseXNpcyAyIikgCgpwbG90X0ExIDwtIGNvcnJfbWF0X0RPTk9IVUUKCnBsb3RfQTIgPC0gY29ycl9tYXRfTE9UVAoKcm93X0EgPC0gcGxvdF9ncmlkKHBsb3RfQTEsCiAgICAgICAgICAgICAgICAgICBwbG90X0EyLAogICAgICAgICAgICAgICAgICAgbnJvdyA9IDEpCgp0aXRsZV9BIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgKICAgICJDb3JyZWxhdGlvbiBiZXR3ZWVuIHZhcmlhYmxlcyBjYW4gaW5kdWNlIG11bHRpY29sbGluZWFyaXR5IiwKICAgIGZvbnRmYWNlID0gJ2JvbGQnLAogICAgc2l6ZT0xNCwKICAgIHggPSAwLAogICAgaGp1c3QgPSAwCiAgKSArCiAgdGhlbWUoCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCAwKQogICkKCmxlZ2VuZF9BIDwtIGdldF9sZWdlbmQoY29ycl9tYXRfTE9UVCkKCnBsb3RfQSA8LSBwbG90X2dyaWQodGl0bGVfQSwKICAgICAgICAgICAgICAgICAgICByb3dfQSwKICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMC4xLDEpKQoKZW1wdHlfZGYgPC0gY2JpbmQoYygxOjEwKSxjKDE6MTApKSAlPiUKICBhcy5kYXRhLmZyYW1lKCkKCmNvbG5hbWVzKGVtcHR5X2RmKSA8LSBjKCJYIiwgIlkiKQoKcGxvdF9CMSA8LSBnZ3Bsb3QoZW1wdHlfZGYsIGFlcyh4ID0gWCwgeSA9IFkpKSArCiAgYW5ub3RhdGUoInRleHQiLAogICAgICAgICAgIHg9NSwKICAgICAgICAgICB5PTUsCiAgICAgICAgICAgbGFiZWwgPSBUZVgoIiRWSUZfe2l9ID0gXFxmcmFjezF9ezEtUl97aX1eezJ9fSQiKSwKICAgICAgICAgICBzaXplID0gOCkgKwogIHRoZW1lX3ZvaWQoKQoKcGxvdF9CMiA8LSB2aWZfcGxvdCArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemU9OCkpCgpyb3dfQiA8LSBwbG90X2dyaWQocGxvdF9CMSwKICAgICAgICAgICAgICAgICAgICAgICBwbG90X0IyLAogICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAxKQoKdGl0bGVfQiA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoCiAgICAiVmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvcnMgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgbXVsdGljb2xsaW5lYXJpdHkgd2hlbiBwcmVzZW50IiwKICAgIGZvbnRmYWNlID0gJ2JvbGQnLAogICAgc2l6ZT0xNCwKICAgIHggPSAwLAogICAgaGp1c3QgPSAwCiAgKSArCiAgdGhlbWUoCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCAwKQogICkKCnBsb3RfQiA8LSBwbG90X2dyaWQodGl0bGVfQiwKICAgICAgICAgICAgICAgICAgICByb3dfQiwKICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMC4xLDEpKQoKcGxvdF9DMSA8LSBjb21wYXJpbmdfYW5hbHlzZXNfcGxvdCArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICBsYWJzKHRpdGxlID0gIkludHJvZHVjZXMgYmlhcyB0byBlc3RpbWF0ZXMiLAogICAgICAgc3VidGl0bGUgPSAiQmlhcyBpbnRyb2R1Y2VkIGNhbiBjaGFuZ2UgZGlyZWN0aW9uIG9mIGVzdGltYXRlIikKCnBsb3RfQzIgPC0gc2ltdWxhdGlvbl9wbG90ICsKICBsYWJzKHRpdGxlID0gIlJlZHVjZXMgcHJlY2lzaW9uIGluIGVzdGltYXRlcyIpCgpyb3dfQyA8LSBwbG90X2dyaWQocGxvdF9DMSwKICAgICAgICAgICAgICAgICAgICAgICBwbG90X0MyLAogICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAxKQoKdGl0bGVfQyA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoCiAgICAiTXVsdGljb2xsaW5lYXJpdHkgY2FuIGhhdmUgYSBuZWdhdGl2ZSBlZmZlY3Qgb24gc3RhdGlzdGljYWwgaW5mZXJlbmNlIiwKICAgIGZvbnRmYWNlID0gJ2JvbGQnLAogICAgc2l6ZT0xNCwKICAgIHggPSAwLAogICAgaGp1c3QgPSAwCiAgKSArCiAgdGhlbWUoCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCAwKQogICkKCnBsb3RfQyA8LSBwbG90X2dyaWQodGl0bGVfQywKICAgICAgICAgICAgICAgICAgICByb3dfQywKICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMC4xLDEpKQoKcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RfQSwKICAgICAgICAgICAgICAgICAgIHBsb3RfQiwKICAgICAgICAgICAgICAgICAgIHBsb3RfQywKICAgICAgICAgIG5jb2wgPSAxLAogICAgICAgICAgcmVsX2hlaWdodHMgPSBjKDEsMSwxKSkKCm1haW5wbG90IDwtIHBsb3RfZ3JpZCh0aXRsZV9wbG90cywKICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkLAogICAgICAgICAgICAgICAgICAgICAgIHBsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICNsZWdlbmRfdXcsCiAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgcmVsX2hlaWdodHMgPSBjKDAuMDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpKQoKbWFpbnBsb3QKYGBgCgoKCmBgYHtyLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpnZ3NhdmUoaGVyZTo6aGVyZSgiaW1nIiwgIm1haW5wbG90LnBuZyIpKQpgYGAKCgoKCiMgKipEYXRhIFZpc3VhbGl6YXRpb24qKgoqKiogCgojICoqU3VtbWFyeSoqCioqKiAKCiMgKipTdWdnZXN0ZWQgSG9tZXdvcmsqKgoqKiogCgojICoqSGVscGZ1bCBMaW5rcyoqCioqKiAKCmh0dHBzOi8vcnB1YnMuY29tL3JzbGJsaXNzL2ZpeGVkX2VmZmVjdHMKCmh0dHA6Ly9rYXJ0aHVyLm9yZy8yMDE5L2ltcGxlbWVudGluZy1maXhlZC1lZmZlY3RzLXBhbmVsLW1vZGVscy1pbi1yLmh0bWwKCmh0dHBzOi8vc3RhdHMuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzk5MjM2L2VmZmVjdHMtaW4tcGFuZWwtbW9kZWxzLWluZGl2aWR1YWwtdGltZS1vci10d293YXlzCgo=